Я пытался удалить расширения PHP с моего сайта. Когда пользователь запрашивает файл PHP, PHP будет удален, и пользователь будет перенаправлен, а когда пользователь будет вводить URL-адрес без PHP, будет подан фактический файл PHP. Это хорошо работает, за исключением случаев, когда в URL есть параметр GET. Мои правила:
# remove .php ONLY if requested directly RewriteCond %{THE_REQUEST} (\.php\sHTTP/1) RewriteRule ^(.+)\.php$ /$1 [R=301,L,QSA] # remove trailing slash ONLY if it is not an existing folder RewriteCond %{REQUEST_FILENAME} !-d RewriteRule ^(.*)/$ /$1 [L,R=301] # rewrite to FILENAME.php if such file does exist and is not a folder RewriteCond %{REQUEST_FILENAME} !-f RewriteCond %{REQUEST_FILENAME} !-d RewriteCond %{REQUEST_FILENAME}\.php -f RewriteRule ^(.*)$ /$1.php [L,QSA]
Я думал, что это уже должно быть возможно удалить php, даже если есть какой-либо параметр GET, но он не удался. Я также пробовал что-то вроде этого:
RewriteCond %{THE_REQUEST} (\.php\sHTTP/1) RewriteRule ^(.)\.php(.)$ $1$2 [R=301,L,QSA]
Это также не сработало, php все еще существует. Но если я попробую:
RewriteRule ^(.)\.php(.)$ $1$2 [R=301,L,QSA]
т.е. удаление RewriteCond, расширение php удаляется и параметры сохраняются, но страница не будет отображаться, поскольку браузер говорит, что слишком много перенаправлений.
Кто-нибудь может подумать?
Спасибо SteAp за ваш ответ. Мне удалось найти способ справиться с этим только сейчас, и я хотел бы поделиться здесь, если другие сталкиваются с подобными проблемами.
В моих правилах у меня есть
# remove .php ONLY if requested directly RewriteCond %{THE_REQUEST} (\.php\sHTTP/1) RewriteRule ^(.+)\.php$ /$1 [R=301,L,QSA]
Выполнять внешнее перенаправление, когда пользователь запрашивает файл PHP. RewriteCond здесь состоит в том, чтобы предотвратить переадресацию циклов – т. Е. Бесконечную переадресацию из-за неправильной внутренней перезаписи и внешнего перенаправления (удаление php, добавление php, затем удаление снова …)
Когда есть параметры, фактический заголовок появляется как http://domain.com/file.php ? …. HTTP / 1.1 Что-то вроде этого, поэтому шаблон в RewriteCond не будет работать, поскольку он не принимает параметры в учетную запись.
Чтобы решить эту проблему, просто замените приведенный выше код:
# remove .php ONLY if requested directly RewriteCond %{THE_REQUEST} (\.php(.*)\sHTTP/1) RewriteRule ^(.+)\.php$ /$1 [R=301,L,QSA]
Таким образом, параметры могут быть сопоставлены шаблоном, и теперь все работает.
Надеюсь, это поможет кому-то, имеющему аналогичную проблему (или это просто нуб, как я? Lol)
Возможно, вы захотите использовать параметр %{QUERY_STRING}
описанный здесь .
Полезное чтение здесь и здесь .