为了将所有somefolder/index.html(以及somefolder/index.htm)重定向到somefolder/,我在Apache .htaccess文件中使用以下简单的重写规则:

RewriteEngine on
RewriteCond %{THE_REQUEST} ^.*\/index\.html?\ HTTP/
RewriteRule ^(.*)index\.html?$ "/$1" [R=301,L]

这很好用!

但是在Google groups上,他们建议还添加:
Options +FollowSymlinks
RewriteBase /
  • 有人能解释我为什么要添加这些最后几行,并向我解释一下它们的意思和作用吗?
  • 不添加这些行是否存在潜在的安全隐患?

  • 非常感谢,

    最佳答案

    为什么建议他们:

    建议您添加Options +FollowSymlinks,因为必须启用symlink following才能使mod_rewrite正常工作,并且有可能虽然允许您将其打开,但主服务器配置未启用它。我怀疑必须遵循symlink的原因是因为该模块对apr_stat()进行了多次调用,看起来它需要遵循symlink才能在所有情况下获取文件信息。

    至于RewriteBase,通常没有必要。文档goes on about it,但是由于大多数人的文件确实位于 DocumentRoot 下,因此通常仅在外部重定向且使用目录相对URL时才有用。为了说明我的意思,请考虑以下几点:

    RewriteEngine On
    
    RewriteRule ^redirect index.html [R,L]
    

    对example.com/redirect的请求将导致外部重定向到example.com/full/path/to/web/root/index.html。原因是在处理重定向之前,mod_rewrite会重新添加当前目录路径(这是RewriteBase的默认值)。如果将RewriteBase修改为/,那么路径信息将替换为该字符串,因此对index.html的请求现在将是对/index.html的请求。

    请注意,无论RewriteBase的值如何,您也可以在替换上明确地执行此操作:
    RewriteEngine On
    
    RewriteRule ^redirect /index.html [R,L]
    

    ...例如按预期工作。但是,如果您有许多需要公共(public)基础的规则并且在目录之间移动,或者您的内容不在根目录下,则在这种情况下适当设置RewriteBase会很有用。

    不使用它们的风险:

    不指定Options +FollowSymlinks绝对没有安全风险,因为如果不指定且不是由主服务器配置设置的,mod_rewrite将始终返回403 Forbidden。对于试图查看您的内容的人来说,这是个问题,但绝对不会给他们任何扩展利用您的代码的机会。

    如果您在一个.htaccess文件中配置了不正确的规则集,则不设置RewriteBase可能会将路径公开到您的Web内容,但是我不确定有任何理由认为存在安全风险。

    10-04 17:25