Учитывая URL
https://example.com/api/test/512/31
Хочу переписать на:
https://example.com/api/test.php?param1=512¶m2=31
Я пробовал:
RewriteEngine On
RewriteCond %{REQUEST_FILENAME}.php -f
RewriteRule !.*\.php$ %{REQUEST_FILENAME}.php?param1=$1¶m2=$2 [QSA,L]
Перезапись работает, но $1
и $2
пусты. Есть идеи, почему?
RewriteRule !.*\.php$ %{REQUEST_FILENAME}.php?param1=$1¶m2=$2 [QSA,L]
Как вы думаете $1
и $2
получить набор? Вы не создали ни одной группы захвата в RewriteRule
шаблон (который является отрицательным шаблоном, поэтому в любом случае не может ничего "сопоставить"), поэтому $1
и $2
обратные ссылки действительно всегда будет пустым.
Поскольку вы используете URL-адреса без расширений, которые сопоставляются непосредственно с файлами, вам также необходимо убедиться, что MultiViews отключен (если это еще не сделано). Если MultiViews включен, вы получите тот же результат - без параметров URL - поскольку mod_negotiation выдал бы внутренний подзапрос для файла перед mod_rewrite.
ОБНОВИТЬ:
Критерии (из комментариев):
.htaccess
файл находится в /api
подкаталог./api/<something>
всегда сопоставляется с /api/<something>.php
. <something>
может состоять из произвольного количества сегментов пути, например. different/anothersubfolder/filename
./512/31
сегменты пути в конце URL-адреса могут состоять из цифр и букв. Всегда есть два отрезка пути, т.е. /#1/#2
.Вместо этого попробуйте следующее:
Options -MultiViews
RewriteEngine On
RewriteCond %{DOCUMENT_ROOT}/api/$1.php -f
RewriteRule ^(.+)/(\w+)/(\w+)$ $1.php?param1=$2¶m2=$3 [QSA,L]
Сокращенный класс символов \w
Спички a-z
, A-Z
, 0-9
и _
(нижнее подчеркивание). Итак, это касается «цифр и букв».