我有以下重写规则:
<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>
除非URI以dispatch.php
开头,否则所有内容都会重写为media/
,在这种情况下,它会将URI重写为project/media/*
。一切正常,如果我导航到它所服务的样式表example.com/media/css/style.css
。如果我导航到example.com/media/css/
,则会发送403 Forbidden错误。完美!
但是,如果我导航到example.com/media/css
(缺少尾随'/'),则位置栏中的网址会重写为example.com/project/media/css
,请求由dispatch.php
处理。如何阻止此行为发生?我希望它由dispatch.php
处理,但不会将projects/
添加到网址。
已解决:问题是由于mod_dir重定向了没有尾部斜杠的网址。这导致磁盘上显示的位置用于重定向,这意味着子文件夹(项目)已附加到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和以前一样:
答案 0 :(得分:1)
您可以使用其他重写规则明确阻止这些目录网址。
或者......您可以使用DirectorySlash关闭重定向。