.htaccess                          |    6 ------  includes/bootstrap.inc             |   22 ++++++++++++++++++++++  includes/common.inc                |    5 ++++-  modules/locale/locale.test         |    5 ++---  sites/default/default.settings.php |   34 ++++++++++++++++++++++++++++++++++  5 files changed, 62 insertions(+), 10 deletions(-)   diff --git .htaccess .htaccess index 1085c51..a488807 100644 --- .htaccess +++ .htaccess @@ -16,12 +16,6 @@ Options +FollowSymLinks  # Make Drupal handle any 404 errors.  ErrorDocument 404 /index.php    -# Force simple error message for requests for non-existent favicon.ico. - -  # There is no end quote below, for compatibility with Apache 1.3. -  ErrorDocument 404 "The requested file favicon.ico was not found. - -  # Set the default handler.  DirectoryIndex index.php index.html index.htm    diff --git includes/bootstrap.inc includes/bootstrap.inc index e931dd7..bc9a01e 100644 --- includes/bootstrap.inc +++ includes/bootstrap.inc @@ -2272,6 +2272,28 @@ function drupal_maintenance_theme() {  }     /** + * Returns a simple 404 Not Found page. + * + * If fast 404 pages are enabled, and this is a matching page then print a + * simple 404 page and exit. + * + * This function is called from drupal_deliver_html_page() at the time when a + * a normal 404 page is generated, but it can also optionally be called directly + * from settings.php to prevent a Drupal bootstrap on these pages. See + * documentation in settings.php for the benefits and drawbacks of using this. + */ +function drupal_fast_404() { +  $fast_paths = variable_get('404_fast_paths', FALSE); +  if ($fast_paths && preg_match($fast_paths, $_GET['q'])) { +    drupal_add_http_header('Status', '404 Not Found'); +    $fast_404_html = variable_get('404_fast_html', '404 Not Found

Not Found

The requested URL "@path" was not found on this server.

'); +    // Replace @path in the variable with the page path. +    print strtr($fast_404_html, array('@path' => check_plain(request_uri()))); +    exit; +  } +} + +/**   * Return TRUE if a Drupal installation is currently being attempted.   */  function drupal_installation_attempted() { diff --git includes/common.inc includes/common.inc index abaf7a9..cc934bf 100644 --- includes/common.inc +++ includes/common.inc @@ -2433,6 +2433,9 @@ function drupal_deliver_html_page($page_callback_result) {             watchdog('page not found', check_plain($_GET['q']), NULL, WATCHDOG_WARNING);    +        // Check for and return a fast 404 page if configured. +        drupal_fast_404(); +          // Keep old path for reference, and to allow forms to redirect to it.          if (!isset($_GET['destination'])) {            $_GET['destination'] = $_GET['q']; @@ -2449,7 +2452,7 @@ function drupal_deliver_html_page($page_callback_result) {          if (empty($return) || $return == MENU_NOT_FOUND || $return == MENU_ACCESS_DENIED) {            // Standard 404 handler.            drupal_set_title(t('Page not found')); -          $return = t('The requested page could not be found.'); +          $return = t('The requested page "@path" could not be found.', array('@path' => request_uri()));          }             drupal_set_page_content($return); diff --git modules/locale/locale.test modules/locale/locale.test index 7f716ba..cdc1c9d 100644 --- modules/locale/locale.test +++ modules/locale/locale.test @@ -261,9 +261,8 @@ class LocaleTranslationFunctionalTest extends DrupalWebTestCase {      $this->assertRaw(t('The language %locale has been removed.', array('%locale' => $name)), t('The test language has been removed.'));      // Reload to remove $name.      $this->drupalGet($path); -    $this->assertNoText($langcode, t('Language code not found.')); -    $this->assertNoText($name, t('Name not found.')); -    $this->assertNoText($native, t('Native not found.')); +    // Verify that language is no longer found. +    $this->assertResponse(404, t('Language no longer found.'));      $this->drupalLogout();         // Delete the string. diff --git sites/default/default.settings.php sites/default/default.settings.php index 6ebacff..4ca69f7 100644 --- sites/default/default.settings.php +++ sites/default/default.settings.php @@ -430,6 +430,40 @@ ini_set('session.cookie_lifetime', 2000000);  # );     /** + * Fast 404 pages: + * + * Drupal can generate fully themed 404 pages. However, some of these responses + * are for images or other resource files that are not displayed to the user. + * This can waste bandwidth, and also generate server load. + * + * The options below return a simple, fast 404 page for URLs matching a + * specific pattern: + * - 404_fast_paths: A regular expression to match paths that should return a + *   simple 404 page, rather than the fully themed 404 page. If you don't have + *   any aliases ending in htm or html you can add '|s?html?' to the expression. + * - 404_fast_html: The html to return for simple 404 pages. + * + * Add leading hash signs if you would like to disable this functionality. + */ +$conf['404_fast_paths'] = '/\.(txt|png|gif|jpe?g|css|js|ico|swf|flv|cgi|bat|pl|dll|exe|asp)$/i'; +$conf['404_fast_html'] = '404 Not Found

Not Found

The requested URL "@path" was not found on this server.

'; + +/** + * By default, fast 404s are returned as part of the normal page request + * process, which will properly serve valid pages that happen to match and will + * also log actual 404s to the Drupal log. Alternatively you can choose to + * return a 404 now by uncommenting the following line. This will reduce server + * load, but will cause even valid pages that happen to match the pattern to + * return 404s, rather than the actual page. It will also prevent the Drupal + * system log entry. Ensure you understand the effects of this before enabling. + * + * To enable this functionality, remove the leading hash sign below. + */ +# drupal_fast_404(); + +/** + +/**   * Authorized file system operations:   *   * The Update manager module included with Drupal provides a mechanism for