Переписывание URL Apache, - PullRequest
2 голосов
/ 02 июня 2009

Я пытаюсь переписать URL для работы на моем сайте. Вот содержимое моего .htaccess:

RewriteEngine On
RewriteRule ^blog/?$ index.php?page=blog [L]
RewriteRule ^about/?$ index.php?page=about [L]
RewriteRule ^portfolio/?$ index.php?page=portfolio [L]
#RewriteRule ^.*$ index.php?page=blog [L]

Теперь 3 правила переписывания без комментариев работают отлично, если я попытаюсь http://www.mysite.com/blog/,, я перенаправлюсь на http://www.mysite.com/index.php?page=blog, одинаково для "about" и "portfolio". Тем не менее, если я ошибаюсь в блоге, скажем, что я пытаюсь http://www.mysite.com/bloh/,, то, очевидно, я получаю ошибку 404. Последнее правило, прокомментированное, должно было помочь предотвратить это. Любой URL должен быть перенаправлен в блог, но, конечно, это правило все еще анализируется, даже если мы успешно использовали предыдущий, поэтому я использовал флаг "last" ([L]). Если я раскомментирую свое последнее правило, все, включая блог, информацию о портфолио и портфолио, будет перенаправлено на блог. Разве «последний» флаг не должен останавливать выполнение, как только он находит соответствующее правило?

Спасибо.

Ответы [ 4 ]

3 голосов
/ 02 июня 2009

Да, последний флаг означает, что он не будет применять ни одно из правил, следующих этому правилу в этом запросе .

После переписывания URL-адреса он выполняет внутренний запрос с использованием нового переписанного URL-адреса, который соответствует вашему последнему RewriteRule, и, таким образом, ваши перенаправления переходят в бесконечный цикл.

Используйте директиву RewriteCond , чтобы ограничить перезапись URL-адресами, которые не начинаются с index.php, и все будет в порядке.

2 голосов
/ 02 июня 2009

Вы можете добавить условие как:

RewriteCond %{REQUEST_URI} !^index\.php

Я также упомяну, что использование RewriteRule ^.*$ - это хороший способ нарушить все ваши медиа-запросы (css, js, images). Возможно, вы захотите добавить некоторые условия, такие как:

RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-f

Чтобы убедиться, что вы не пытаетесь переписать актуальные файлы или каталоги, которые существуют на вашем сервере. В противном случае они будут недоступны, если только index.php их тоже обслуживает!

1 голос
/ 03 июня 2009

После того, как вы обработали [L] запрос, вся обработка снова запускается для нового (переписанного) URL. Вы можете выйти из этого цикла, используя перед другими правилами :

RewriteRule ^index.php - [L]

, что означает «для index.php не переписывать и не оставлять обработку».

1 голос
/ 02 июня 2009

Из документов Apache mod_rewrite

'last | L' (последнее правило) Остановите процесс переписывания здесь и не применяйте больше переписывать правила. Это соответствует Perl последняя команда или команда прерывания в C. Используйте этот флаг, чтобы предотвратить в настоящее время переписанный URL из переписан далее по следующим правилам. Помните, однако, что если RewriteRule создает внутренний перенаправление (которое часто происходит, когда переписывание в контексте каталога), это будет отклонить запрос и приведет к повторной обработке начиная с первого RewriteRule.

Вы можете использовать

 ErrorDocument 404 /index.php?page=blog

но вы должны знать, что он не возвращает код ошибки 404, а код перенаправления, и я не знаю, является ли это хорошей практикой.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...