mod_rewrite "400 неверных запросов" проблема - PullRequest
14 голосов
/ 24 мая 2011

Я не могу избежать ошибки Bad Request при настройке mod_rewrite. Я уже некоторое время пытаюсь, вот что у меня есть.

URL, к которому я пытаюсь получить доступ:

gordons.local/brewCalc

Я бы хотел увидеть страницу

gordons.local/index.php?page=brewCalc

Вот мое правило переписывания:

    RewriteEngine on
    RewriteLog /var/www/gordons.com/logs/rewrite.log
    RewriteRule ([^/]+)/?$ index.php?page=$1 [L]

Я использовал инструмент регулярных выражений, и этот инструмент , но независимо от того, что я получаю на странице, которая говорит:

Bad Request

Your browser sent a request that this server could not understand.
Additionally, a 400 Bad Request error was encountered while trying to use an ErrorDocument to handle the request.

Apache/2.2.12 (Ubuntu) Server at gordons.local Port 80

Кроме того, я не получаю никакой информации в журналах доступа, ошибок или перезаписи.

РЕДАКТИРОВАТЬ: мои правила перезаписи находятся в моем файле vhost. (/etc/apache2/sites-available/gordons.local)

Ответы [ 2 ]

84 голосов
/ 25 мая 2011

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

RewriteRule ([^/]+)/?$ index.php?page=$1 [L]

Должно было быть

RewriteRule ([^/]+)/?$ /index.php?page=$1 [L]

Grrrr ....

2 голосов
/ 24 мая 2011

Если вы увидите Apache error.log, вы сможете увидеть фактическую ошибку. Скорее всего, вы пытаетесь поместить вышеуказанные правила в файл .htaccess, а RewriteLog не допускается в файле .htaccess. Также ваш RewriteRule будет перенаправлять больше, чем вы собираетесь. Так что, если вы закомментируете свой RewriteLog и у вас будет RewriteRule, как это, то он должен работать:

RewriteEngine On
RewriteBase /

# request is not for a file
RewriteCond %{REQUEST_FILENAME} !-f
# request is not for a directory
RewriteCond %{REQUEST_FILENAME} !-d
# forward to index.php
RewriteRule ^([^/]+)/?$ index.php?page=$1 [L,QSA,NC,NE]
  • NC - игнорировать сравнение случаев
  • NE - Не кодировать RHS URI
  • QSA - Добавить существующую строку запроса в новую
  • L - пометить это последнее правило
...