重写浏览器位置栏中显示的规则

时间:2010-01-06 09:56:58

标签: apache .htaccess mod-rewrite

我有以下重写规则:

<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和以前一样:

  • 禁用mod_dir。
  • 向URI添加尾部斜杠 通过使用RewriteRule。

1 个答案:

答案 0 :(得分:1)

您可以使用其他重写规则明确阻止这些目录网址。

或者......您可以使用DirectorySlash关闭重定向。

http://httpd.apache.org/docs/2.0/mod/mod_dir.html