У меня есть следующие правила переписывания:
<IfModule mod_rewrite.c>
RewriteEngine on
RewriteBase /
# Route all URLs to dispatch.php.
RewriteCond %{REQUEST_URI} !media/
RewriteRule ^(.*)$ dispatch.php [L]
#Route requests to /media/* to /project/media/*
RewriteRule ^media/(.*)?$ project/media/$1 [L]
</IfModule>
Все переписывается в dispatch.php
, если только URI не начинается с media/
, в этом случае он перезаписывает URI в project/media/*
. Все работает нормально, и если я перейду к example.com/media/css/style.css
таблице стилей, которую он обслуживал. Если я перехожу на example.com/media/css/
, то отправляется ошибка 403 Forbidden. Отлично!
Однако, если я перейду к example.com/media/css
(пропуская завершающий символ '/'), то URL-адрес в строке адреса переписывается на example.com/project/media/css
, а запрос обрабатывается dispatch.php
. Как мне остановить это поведение? Я бы хотел, чтобы он обрабатывался dispatch.php
, но без добавления projects/
в URL.
Решено: Проблема заключалась в том, что mod_dir перенаправлял URL-адреса без косой черты. Это привело к тому, что расположение на диске используется для перенаправления, что означает, что подпапка (проект) была добавлена к URI. Окончательный .htaccess, который я использовал, выглядит следующим образом:
Options +FollowSymLinks +MultiViews -Indexes
Options -Indexes
<IfModule mod_dir.c>
DirectorySlash Off
</IfModule>
<IfModule mod_rewrite.c>
RewriteEngine on
RewriteBase /
#Add trailing slashes
RewriteCond %{REQUEST_URI} !(.*)/$
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^(.*)$ $1/ [R=301,L]
#Route requests to /media/* to /project/media/*
RewriteRule ^media(/.*)$ project/media$1 [L]
# Route all URLs to dispatch.php.
RewriteCond %{REQUEST_URI} !^media/(.*)
RewriteRule ^(.*)$ dispatch.php [L]
</IfModule>
Новый .htaccess делает то же, что и раньше, а также:
- Отключает mod_dir.
- Добавляет косые черты в URI
с помощью RewriteRule.