Intereting Posts
Как я могу запретить пользователям доступ к файлам include? PHP некоторые значения $ _POST отсутствуют, но присутствуют в php: // input Могу ли я определить PHP_INT_SIZE на 4 байта в 64-битной системе, на которой запущен PHP? защита php включает (с htaccess?) Десятичные вычисления PHP Остановите скрипт (без фатальной ошибки) после определенного количества времени запроса / разбора Драйвер базы данных CodeIgniter PDO не работает Преобразование временной метки в относительную дату / время (например, «2 минуты назад») и постоянное обновление ее с помощью Javascript скрипт работает нормально, когда запускается из командной строки, но не через cron Переопределение файла шаблона Magento Adminhtml PHP – переключатели Codeigniter socket_connect не отключается Как фиксировать детали очереди заданий после завершения в Laravel 5.1? Поместите изображение в центр другого изображения, используя PHP GD Пропущенные массивы теряют все, кроме первого элемента

Как использовать Apache Mod_rewrite для удаления расширения php, сохраняя параметры GET?

Я пытался удалить расширения 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} описанный здесь .

Полезное чтение здесь и здесь .