Использование mod_rewrite, чтобы скрыть .php от конца URL - PullRequest
6 голосов
/ 21 июня 2010

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

Я добавил следующее в файл .htaccess, и теперь я могу получить доступ к .phpфайлы без расширения .php:

RewriteEngine On  # Turn on rewriting

RewriteCond %{REQUEST_FILENAME}.php -f  # If the requested file with .php on the end exists
RewriteRule ^(.*)$ $1.php #  serve the PHP file

Пока все хорошо.Но теперь я хочу добавить перенаправление для всех файлов .php, чтобы любые старые ссылки вне моего контроля перенаправлялись на новую версию URL.

Я пробовал это:

RewriteEngine On  # Turn on rewriting

RewriteCond %{REQUEST_URI} .*\.php
RewriteRule ^(.*)\.php$ http://example.com/$1 [R=permanent,L]

RewriteCond %{REQUEST_FILENAME}.php -f  # If the requested file with .php on the end exists
RewriteRule ^(.*)$ $1.php [L] #  serve the PHP file

но это, кажется, отправляет перенаправление даже для URL, которые не заканчиваются на .php, поэтому я застреваю в бесконечном цикле.Любая другая комбинация, которую я пробую, кажется, не соответствует ни одному запросу (и оставляет меня в page.php), ни всем запросам (и приводит меня в тупик).

Ответы [ 5 ]

7 голосов
/ 21 июня 2010
RewriteEngine On

RewriteCond %{THE_REQUEST} ^\w+\ /(.*)\.php(\?.*)?\ HTTP/
RewriteRule ^ http://%{HTTP_HOST}/%1 [R=301]

RewriteCond %{REQUEST_FILENAME}.php -f
RewriteRule .* $0.php

Только %{THE_REQUEST} не переписывается во внутреннем перенаправлении, которое происходит во втором правиле (%{REQUEST_URI}, с другой стороны, есть).

0 голосов
/ 21 июня 2010

Благодаря указателю на этот вопрос от @TheDeadMedic я смог найти решение своей проблемы, изменив:

RewriteCond %{REQUEST_URI} .*\.php

на:

RewriteCond %{THE_REQUEST} ^GET\ (.*)\.php\ HTTP

Я не понимаю, почему моя версия не сделала то же самое.

0 голосов
/ 21 июня 2010

Добавить NS в список параметров этого последнего правила

0 голосов
/ 21 июня 2010

Вы также можете добавить [L] в RewriteRule для добавления .php, чтобы он прекратил обработку других правил:

RewriteRule ^(.*)$ $1.php [L] #  serve the PHP file
0 голосов
/ 21 июня 2010

Вы перенаправляете страницы, заканчивающиеся на .php, на страницу без .php

Тогда ваше первое правило перенаправляет все страницы, не заканчивающиеся на .php, на имя страницы, заканчивающееся на .php

Этопочему у вас есть петля: -)

...