Подтвердить что ты не робот

Mod_rewrite "400 Bad Request" проблема

Похоже, что я не могу пройти мимо ошибки 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]

Я использовал инструмент regex и этот инструмент, но независимо от того, что у меня на странице, где написано:

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

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

EDIT: мои правила перезаписи находятся в моем файле vhost. (/etc/apache2/sites-available/gordons.local)

4b9b3361

Ответ 1

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

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

Должно быть

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

Grrrr....

Ответ 2

Если вы увидите 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 - не кодировать URI RHS
  • QSA - добавление существующей строки запроса в новую
  • L - Отметить последнее правило