Apache .htaccess将index.htmlredirect到root,为什么要使用FollowSymlinks和RewriteBase?

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

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

这效果很好!

但在Google组织中,他们还build议增加:

 Options +FollowSymlinks RewriteBase / 
  1. 任何人都可以如此善意地解释我为什么要添加这些最后一行,并解释一下他们是什么意思,他们做什么?

  2. 有没有添加这些线潜在的安全风险?

非常感谢,

为什么他们建议:

建议您添加Options +FollowSymlinks因为有必要启用mod_rewrite的符号链接以使其可以正常工作,并且有可能允许您打开它,但主服务器配置不会启用它。 我怀疑之所以符号链接以下是必要的,因为该模块进行了一些调用apr_stat() ,这看起来像它需要遵循符号链接,以获得所有情况下的文件信息。

至于RewriteBase ,通常没有必要。 文档还在继续 ,但是由于大多数人的文件存在于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的值如何,您都可以在替换上明确地做到这RewriteBase

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

例如,按预期工作。 但是,如果你有很多规则需要一个共同的基础,并且在目录之间转移,或者你的内容不在根目录下,那么在这种情况下适当地设置RewriteBase会很有用。

不使用它们的风险:

在没有指定Options +FollowSymlinks的情况下绝对没有安全风险,因为如果你不这样做并且它没有被主服务器配置设置,mod_rewrite将总是返回403 Forbidden。 对于试图查看您的内容的用户来说,这是一个问题,但是绝对不会给他们任何利用代码的机会。

不设置RewriteBase可能会暴露您的网页内容的路径,如果你有一个.htaccess文件中配置不当的规则集,但我不确定是否有任何理由考虑到安全风险。