Апач переписывания URL-адресов,


Я пытаюсь заставить перезапись 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 , то же самое для "О" и "портфолио". Однако, если я неправильно наберу блог, скажите, что я пытаюсь http://www.mysite.com/bloh/, то, очевидно, я получаю ошибку 404. Последнее правило, комментируемое, должно было помочь предотвратить тот. Любой URL должен быть перенаправлен на блог, но, конечно, это правило все еще анализируется, даже если мы успешно использовали предыдущий, поэтому я использовал флаг "last" ([L]). Если я раскомментирую свое последнее правило, все, включая блог, о нем и портфолио, перенаправится в блог. Разве флаг" последний " не должен остановить выполнение, как только он найдет соответствующее правило?

Спасибо.

4 2

4 ответа:

Можно добавить условие типа:

RewriteCond %{REQUEST_URI} !^index\.php

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

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

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

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

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

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

Из Apache mod_rewrite docs

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

Можно использовать

 ErrorDocument 404 /index.php?page=blog
Но вы должны знать, что он не возвращает код ошибки 404, а перенаправляет его, и я не знаю, является ли это такой хорошей практикой.

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

RewriteRule ^index.php - [L]

Что означает " для индекса.php, не переписывайте и не оставляйте обработку."