Используя mod_rewrite для сокрытия .php от конца URL

У меня есть сайт, где все страницы являются сценариями 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) или все запросы (и вовлеките меня в цикле).

6
задан rjmunro 21 June 2010 в 16:17
поделиться

5 ответов

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} , с другой стороны , является).

7
ответ дан 17 December 2019 в 00:03
поделиться

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

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

Вот почему у вас есть цикл: -)

0
ответ дан 17 December 2019 в 00:03
поделиться

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

0
ответ дан 17 December 2019 в 00:03
поделиться

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

RewriteRule ^(.*)$ $1.php [L] #  serve the PHP file
0
ответ дан 17 December 2019 в 00:03
поделиться

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

RewriteCond %{REQUEST_URI} .*\.php

на:

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

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

0
ответ дан 17 December 2019 в 00:03
поделиться
Другие вопросы по тегам:

Похожие вопросы: