У меня есть сайт, где все страницы являются сценариями 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) или все запросы (и вовлеките меня в цикле).
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}
, с другой стороны , является).
Вы перенаправляете страницы, заканчивающиеся на .php, на страницу без .php
Затем ваше первое правило перезаписывает все страницы, не заканчивающиеся на .php, на имя страницы, заканчивающееся на .php
Вот почему у вас есть цикл: -)
Добавить NS
в список параметров этого последнего правила
Вы также можете добавить [L]
в RewriteRule для добавления .php
, чтобы он прекратил обработку других правил:
RewriteRule ^(.*)$ $1.php [L] # serve the PHP file
Благодаря указателю на этот вопрос от @TheDeadMedic, я смог найти решение моей собственной проблемы, изменив:
RewriteCond %{REQUEST_URI} .*\.php
на:
RewriteCond %{THE_REQUEST} ^GET\ (.*)\.php\ HTTP
I не понимаю, почему моя версия не сделала то же самое.