#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
Флаг здесь тоже был лишним.