Ниже приведен мой текущий файл .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
. Как я могу этого добиться? Я совершенно ничего не знаю о регулярных выражениях
Регулярное выражение ^ ([^ /] +) /?
захватывает только первый сегмент пути , т.е. [^ /] +
соответствует 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]