apache2 Переписать путь для получения параметра - заставить косые черты работать

Ниже приведен мой текущий файл .htaccess . Если я открою https://example.com/test , и он не закончится ни одним из окончаний, указанных в строке 2, он откроет https://example.com/index. php? url = test

RewriteEngine on
RewriteCond %{REQUEST_FILENAME} !\.(css|js|png|jpg|php|svg|gif|webm|webp|eot|ttf|woff|woff2)
RewriteRule ^([^/]+)/? index.php?url=$1 [L,QSA]

Однако, если я попытаюсь открыть https://example.com/something/test , он просто откроет ? url = something вместо ]? url = something / test . Как я могу этого добиться? Я совершенно ничего не знаю о регулярных выражениях

2
задан 14 October 2019 в 05:24
1 ответ

Регулярное выражение ^ ([^ /] +) /? захватывает только первый сегмент пути , т.е. [^ /] + соответствует 1 или более символам без косой черты. Если вы хотите сопоставить весь URL-путь, используйте (. +) (чтобы сопоставить 1 или более любых символов). Однако вы можете ввести более строгие ограничения, если хотите сопоставить только, скажем, 1 или 2 сегмента пути?

и он не заканчивается одним из окончаний, указанных в строке 2

Это условие специально не проверяет, что URL-адрес «заканчивается» одним из этих расширений, он проверяет, содержится ли одно из этих расширений в пути файловой системы, которому соответствует URL-адрес. Вам нужен якорь конца строки $ в конце регулярного выражения. И чтобы конкретно проверить URL, вы должны свериться с серверной переменной REQUEST_URI .

Таким образом, это становится:

RewriteEngine on
RewriteCond %{REQUEST_URI} !\.(css|js|png|jpg|php|svg|gif|webm|webp|eot|ttf|woff|woff2)$
RewriteRule (.+) index.php?url=$1 [L,QSA]
1
ответ дан 3 December 2019 в 12:28

Теги

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