Назад | Перейти на главную страницу

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. Как я могу этого добиться? Я абсолютно ничего не знаю о регулярных выражениях

Регулярное выражение ^([^/]+)/? захватывает только первый сегмент пути, т.е. [^/]+ соответствует 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]