htaccess — Принудительно переместите косую черту в конец динамического URL-адреса

#php #apache #.htaccess #mod-rewrite

#php #апач #.htaccess #мод-переписать

Вопрос:

У меня есть один index.php файл в /slug подкаталоге, и я хотел бы загрузить динамическое содержимое на основе пути к файлу. Независимо от того, что такое URL-адрес, содержимое должно ссылаться на это index.php .

В моем коде ниже косая черта не добавляется в конце URL-адреса. Например, example.com/slug/33 должно отображаться в адресной строке как example.com/slug/33/ .

У меня есть следующий .htaccess в /slug :

 Options -Indexes  # Turn mod_rewrite on RewriteEngine On RewriteBase /  # Dynamic url RewriteCond %{REQUEST_FILENAME} !-f RewriteCond %{REQUEST_FILENAME} !-d RewriteRule ^(.*)$ /slug/index.php/?path=$1 [NC,L,QSA]  

Я попытался добавить « / между index.php и ?path=$ «, но не получил желаемого результата. Возможно ли это вообще?

Ответ №1:

 RewriteRule ^(.*)$ /slug/index.php/?path=$1 [NC,L,QSA]  

Изменение строки подстановки здесь изменяет цель вашей внутренней перезаписи — это ничего не делает для изменения видимого URL-адреса. Добавляя косую черту после index.php того, как вы (без необходимости) добавляете дополнительную информацию о пути (path-info) к полученному URL-адресу, который получает ваше приложение.

Чтобы изменить видимый URL-адрес (добавить косую черту), вам необходимо реализовать внешнее перенаправление. Однако, чтобы подтвердить… вы уже должны ссылаться на правильный канонический URL (т. Е. с косой чертой) в ваших внутренних ссылках. Добавление косой черты к URL .htaccess -адресу возможно только в том случае, если вы изменили URL-адрес, а поисковые системы или сторонние организации все еще используют старый неканонический URL-адрес (без конечной косой черты).

Поскольку .htaccess файл находится в /slug подкаталоге, и вы переписываете index.php его в этот подкаталог, вам не нужно добавлять префикс к переписанному URL /slug/ -адресу . По умолчанию относительный URL-путь относится к каталогу, содержащему .htaccess файл. Однако вы также должны удалить RewriteBase директиву (или установить это значение «правильно» RewriteBase /slug ).

Чтобы перенаправить для добавления завершающей косой черты, вы можете добавить следующее перед текущей перезаписью:

 # Append trailing slash if omitted RewriteRule ^(.*(?:^|/)[^/.] )$ /slug/$1/ [R=301,L]  

Для этого требуется /slug/ префикс в строке подстановки (если RewriteBase /slug он не установлен), в противном случае внешнее перенаправление попытается перенаправить на путь к файлу, который «сломается».

RewriteRule Шаблон ^(.*(?:^|/)[^/.] )$ захватывает URL-пути, которые еще не заканчиваются косой чертой и не содержат точки в последнем сегменте пути. Это делается для того, чтобы избежать совпадения URL-адресов, которые уже содержат (как выглядит) расширение файла, т. Е.. ваши статические ресурсы (изображения, CSS, JS и т.д.). Это позволит избежать необходимости проверки файловой системы (которая является относительно дорогостоящей) — чтобы убедиться, что запрос еще не сопоставлен с файлом. Хотя, если вы не ссылаетесь на какие-либо статические ресурсы с /slug/ префиксом в URL-адресе, это можно упростить.

ПРИМЕЧАНИЕ: Сначала вам следует протестировать 302 (временное) перенаправление, чтобы избежать потенциальных проблем с кэшированием.

В контексте (с использованием RewriteBase ):

 Options -Indexes  # Turn mod_rewrite on RewriteEngine On RewriteBase /slug  # Append trailing slash if omitted RewriteRule ^(.*(?:^|/)[^/.] )$ $1/ [R=301,L]  # Dynamic url RewriteCond %{REQUEST_FILENAME} !-f RewriteCond %{REQUEST_FILENAME} !-d RewriteRule (. ) index.php?path=$1 [QSA,L]  

Использование RewriteBase позволяет избежать необходимости указывать /slug/ в других директивах.

В регулярном ^(.*)$ выражении якоря начала строки ( ^ ) и конца строки ( $ ) являются лишними. И вы также можете изменить это, чтобы использовать квантор, так как вы все равно не хотите сопоставлять базовый каталог (сохраняет две дополнительные проверки файловой системы). NC Флаг здесь тоже был лишним.