Apache mod_rewrite, возвращающий неверный запрос в WAMPServer - PullRequest
2 голосов
/ 26 февраля 2011

Я использую 64-разрядную версию Windows 7 с WAMPServer 2.1.Версия Apache работает 2.2.17.Я пытаюсь настроить простое правило перезаписи в httpd.conf:

<IfModule rewrite_module>
RewriteEngine on
RewriteCond %{SCRIPT_FILENAME} !-f
RewriteCond %{SCRIPT_FILENAME} !-d
RewriteRule ^(.*)$ index.php?page=$1 [PT,QSA,L]
</IfModule>

У меня есть более простые RewriteRules для работы ранее, без регулярных выражений, выражений перезаписи и тому подобного.Однако, похоже, что в этот момент я получаю ошибку 400 Bad Request каждый раз, когда пытаюсь посетить любой URL, когда это правило активно.Файл журнала Apache выдает эти ошибки всякий раз, когда это происходит:

[Sat Feb 26 10:24:18 2011] [error] [client 127.0.0.1] Invalid URI in request GET /index.php HTTP/1.1
[Sat Feb 26 10:24:21 2011] [error] [client 127.0.0.1] Invalid URI in request GET / HTTP/1.1

Первая ошибка, которую я попытался нажать localhost/index.php.Второй я только что попробовал localhost.

Более того, даже когда у меня работало более простое правило, строки RewriteCond, похоже, не работали: статические существующие файлы, такие как style.css, все равно перенаправлялись.

ВключениеПохоже, что RewriteLogging приводит к сбою Apache, который, как представляется, является документированной проблемой на 64-битных машинах под управлением Windows 7 .Есть идеи, в чем может быть проблема?

Ответы [ 2 ]

1 голос
/ 27 февраля 2011

Здесь есть две проблемы, которые, вероятно, способствуют вашим неприятностям. Во-первых, вы не можете так легко проверить существование файла в контексте сервера (как в случае с httpd.conf), поскольку запрос еще не был сопоставлен с файловой системой.

Если ваши запросы на статические ресурсы оказываются непосредственно соответствующими структуре вашей файловой системы за пределами DOCUMENT_ROOT, вы можете решить эту проблему, добавив значение DOCUMENT_ROOT перед входящим REQUEST_URI, как показано ниже:

RewriteCond %{DOCUMENT_ROOT}%{REQUEST_URI} !-f
RewriteCond %{DOCUMENT_ROOT}%{REQUEST_URI} !-d

Если путь к вашим статическим ресурсам преобразуется где-то вниз по линии, в документации mod_rewrite предлагается использовать следующее, что выдаст подзапрос для выполнения просмотра на основе URI запроса:

RewriteCond %{LA-U:REQUEST_FILENAME} !-f
RewriteCond %{LA-U:REQUEST_FILENAME} !-d

Однако этот подход более дорогой, поэтому попробуйте использовать первый, где это возможно.

Во-вторых, URI, который вы передаете обратно в запрос, на самом деле недействителен, поскольку для него требуется начальная косая черта. Исправляя это и комбинируя его с новыми условиями, приведенными выше, вы получаете этот измененный набор правил:

RewriteEngine On

RewriteCond %{DOCUMENT_ROOT}%{REQUEST_URI} !-f
RewriteCond %{DOCUMENT_ROOT}%{REQUEST_URI} !-d
RewriteRule ^.*$ /index.php?page=$0 [PT,QSA,L]

Обратите внимание, что здесь значение page всегда будет иметь начальную косую черту, поэтому вы можете вместо этого использовать это правило, в зависимости от вашей логики обработки в index.php:

RewriteRule ^/(.*)$ /index.php?page=$1 [PT,QSA,L]
0 голосов
/ 26 февраля 2011

Вы пытались установить переменную

RewriteBase / your_directory

?

...