GET Параметр с прямым sla sh in PHP / htaccess - PullRequest
1 голос
/ 11 марта 2020

В последнее время у меня проблемы с htaccess и PHP. У меня есть рабочий код, который удаляет «. php» с веб-адреса только с файлом .htacess, превращая:

Этот адрес

http://localhost/dashboard.php

В

http://localhost/dashboard

Вот код:

RewriteEngine on
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME}\.php -f
RewriteRule ^(.*)$ $1.php [NC,L]

Но сейчас я пытаюсь передать некоторые параметры GET через forward sla sh. Как это:

Включите это:

http://localhost/dashboard.php?id=20

В это:

http://localhost/dashboard/20

Я уже пробовал этот код, но не работает (ошибка 500) :

RewriteEngine on

RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME}\.php -f
RewriteRule ^/?([^/]+)/(\d*)/?$ /$1.php?id=$2 [END]

RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME}\.php -f
RewriteRule ^/?(.*)/?$ /$1.php [END]

Я что-то здесь упускаю?

1 Ответ

0 голосов
/ 12 марта 2020

Ошибка 500, скорее всего, является результатом внутренней перезаписи l oop, поскольку условие, которое проверяет, что расширение запроса + .php (ie. %{REQUEST_FILENAME}\.php) отображается в файле, не обязательно совпадает с URL-путь, по которому вы переписываете (ie. /$1.php?id=$2). См. мой ответ на следующий вопрос ServerFault, в котором это подробно обсуждается: https://serverfault.com/questions/989333/using-apache-rewrite-rules-in-htaccess-to-remove-html-causing-a-500-error

Вместо этого попробуйте следующее:

Options -MultiViews

RewriteEngine On

RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{DOCUMENT_ROOT}/$1.php -f
RewriteRule ^([^/.]+)/?(\d+)?$ $1.php?id=$2 [L]

Это обрабатывает оба сценария ios:

  • /dashboard внутренне переписан в /dashboard.php?id=
  • /dashboard/20 внутренне переписан в /dashboard.php?id=20

Сделав шаблон RewriteRule более ограничительным, проверка, проверяющая, отображается ли запрос на файл, кажется излишней, поскольку шаблон вряд ли будет соответствовать реальному файлу. , Кроме того, любой настоящий файл + .php в любом случае также вряд ли будет файлом - поэтому обе проверки не требуются.

Нет необходимости в обратном слэсе sh экранировать буквальную точку в RewriteCond TestString (ie. %{DOCUMENT_ROOT}/$1.php), поскольку это «обычная» строка, а не регулярное выражение, следовательно, точка здесь не имеет особого значения.

MultiViews необходимо отключить для эти директивы функционируют как задумано. (Возможно, это уже отключено на вашем сервере.)


В стороне:

У меня есть работающий код, который удаляет ". php "с веб-адреса только с файлом .htacess

Хотя это обычно пишется (неправильно) таким образом, это не то, что делают эти директивы. (Расширение .php предположительно уже удалено из вашего источника HTML.) Фактически, эти директивы полностью противоположны ... они добавляют расширение файла .php к запрошенному (без расширения) URL-адресу для внутренней перезаписи запрос обратно к базовому пути файловой системы.

(Вы можете использовать .htaccess до удалить расширение .php, для выгоды SEO (только). Но это требует очень Другое правило - внешний редирект.)

...