Ниже приводится мой текущий .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]