.htaccess Проверьте наличие файла в двух местах, иначе выкиньте 404 - PullRequest
2 голосов
/ 01 июня 2011

То, как мой сайт в настоящее время структурирован, фактический сайт находится в отдельной папке. Вот что я имею в виду:

 /projects
 /files
 /pictures
 /tools
 /school
 /~webroot
 .htaccess

Это значительно упрощает управление файловой системой и ее навигацию. Простой способ использовать это, не заставляя всех переходить к http://domain.com/~webroot/ и по-прежнему разрешать им доступ к файлам и таким, как http://domain.com/projects/, - это использовать htaccess, который я написал ниже, для проверки файлов в реальном корне, и ~ каталоги webroot.

RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)$ /~webroot/$1 [NC,QSA]
RewriteRule ^/?$ /~webroot/index.php [L,QSA]

Однако, если файл нигде не существует (root или ~ webroot), вместо HTTP 404 выдается ошибка HTTP 500. Чтобы отобразить мою страницу ошибки 404, я должен вместо этого использовать следующие строки:

RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{DOCUMENT_ROOT}/~webroot/$0 !-F
RewriteRule ^(.*)$ /404.shtml [B,L]

RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !^/~webroot
RewriteRule ^(.*)$ /~webroot/$1 [NC,QSA]
RewriteRule ^/?$ /~webroot/index.php [L,QSA]

Это все довольно грязно, и это всего лишь уловка и фактически не выдает HTTP 404, который удерживает 404 от документирования с помощью моего статистического приложения. Есть ли способ: проверить, существует ли файл в корне, если нет, проверить, существует ли файл в ~ webroot, если нет, выдать ошибку реального HTTP 404?

У меня также все мои ErrorDocument определены правильно.

Ответы [ 2 ]

4 голосов
/ 08 декабря 2011

Я знаю, что это было некоторое время назад, но хотел вмешаться. Для правила перезаписи на 404 я всегда использую это:

RewriteRule ^(.*)$ - [R=404,L]

Я не уверен, правильно ли это, но у меня работает. Я почти уверен, что это всегда должно быть с "L", чтобы предотвратить дальнейшее переписывание.

Кстати, для чего нужен флаг "B"? Я знаю только те, что перечислены на странице apache mod_rewrite, поэтому я заблудился в их значении.

http://httpd.apache.org/docs/2.0/mod/mod_rewrite.html

РЕДАКТИРОВАТЬ: ах, моя проблема в том, что я смотрю на старые версии документов. Спасибо, Swivelgames. Я, вероятно, никогда бы не узнал, что смотрю на старые документы, если бы вы не указали на это (нужно обновить мои закладки).

http://httpd.apache.org/docs/2.3/rewrite/flags.html#flag_b

0 голосов
/ 01 июня 2011

Если вы можете сделать свою страницу 404 файлом PHP, вы можете добавить ее перед любым выводом, чтобы получить реальные 404:

<?php header("HTTP/1.1 404 Not Found"); ?>

Это заставит PHP вызвать «реальное» 404 (из браузеров).точка зрения), которая передается обратно в браузер.Если ваш пакет статистики является внутренним для вашего сервера, такой подход может или не может работать, я не уверен.

Единственное другое решение, которое я могу придумать, - это перенаправить на несуществующий файл:

RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !/non-existent-404-generator
RewriteCond %{DOCUMENT_ROOT}/~webroot/$0 !-F
RewriteRule ^(.*)$ /non-existent-404-generator [B,L]
...