Что не так с моим RewriteRule? - PullRequest
       21

Что не так с моим RewriteRule?

0 голосов
/ 21 марта 2009

Мой файл .htaccess в настоящее время выглядит следующим образом

AddType x-mapp-php5 .php
Options +FollowSymLinks
Options +Indexes
RewriteEngine On
RewriteBase /
RewriteRule ^account$ /account/orders.php [L]

Когда я перехожу на http://mywebsite.com/account, он правильно показывает страницу на http://mywebsite.com/account/orders.php. Но когда я изменяю RewriteRule на

RewriteRule ^account/orders$ /account/orders.php [L]

и затем я иду к http://mywebsite.com/account/orders, я получаю сообщение об ошибке 404 Страница не найдена. Что я сделал не так?

****** Дополнительные детали **

Я наконец диагностировал проблему. Но я не понимаю, почему мое решение работает. Рассмотрим сценарий, в котором существует account / orders.php.

Следующее правило не будет работать

RewriteRule ^account/orders$ account/orders.php [L]

Следующее правило будет работать

RewriteRule ^account/order$ account/orders.php [L]

Т.е., правило перезаписи не будет выполнено, если шаблон оценивает существующий файл. Поэтому, когда шаблон такой же, как подстановка, но без расширения, правило перезаписи не будет выполнено. Если я добавлю файл account / order.php, оба правила потерпят неудачу.

Почему это происходит?

Ответы [ 5 ]

1 голос
/ 21 марта 2009

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

RewriteRule ^ / account / orders $ /account/orders.php [L]

0 голосов
/ 21 марта 2009

Я отвечаю на свой вопрос, потому что наконец-то диагностировал проблему. Но я не понимаю, почему мое решение работает. Рассмотрим сценарий, в котором существует account / orders.php.

Следующее правило не будет работать

RewriteRule ^account/orders$ account/orders.php [L]

Следующее правило будет работать

RewriteRule ^account/order$ account/orders.php [L]

Т.е., правило перезаписи не будет выполнено, если шаблон оценивает существующий файл. Поэтому, когда шаблон такой же, как подстановка, но без расширения, правило перезаписи не будет выполнено. Если я добавлю файл account / order.php, оба правила потерпят неудачу.

Почему это происходит?

0 голосов
/ 21 марта 2009

Сначала я бы попытался добавить перенаправление в мои правила, чтобы в браузере было видно, что происходит на сервере.

RewriteRule ^account$ /account/orders.php [L,R]

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

0 голосов
/ 21 марта 2009

Вы пробовали относительный путь?

RewriteRule ^account/orders$ account/orders.php [L]

Редактировать Вы также должны убедиться, что MultiViews отключено. Это приводит к тому, что Apache выполняет некоторое дополнительное расплывчатое сопоставление файлов, чтобы найти похожие именованные файлы, и поэтому /account/orders будет сопоставлено с /account/orders.php до того, как оно будет передано mod_rewrite.

0 голосов
/ 21 марта 2009

Странно, мне кажется, это нормально ... Если у вас есть доступ к конфигурации Apache, попробуйте включить RewriteLog и RewriteLogLevel для некоторой отладки ...

Также загляните в файлы журнала сайта (всегда, если у вас есть доступ)

...