解释这个.htaccess片段

时间:2011-03-16 08:45:49

标签: regex .htaccess

有人可以解释以下htacess行,我理解部分,但想要更深入的知识。作为一个注释,我假设它按预期工作,这不是现在的,我只是阅读一些工作簿,这是打印。

// Don't understand this line 
Options -Multiviews 

// Don't understand this line
Options +FollowSymLinks

// Understand this line
RewriteEngine On

// Don't ~fully~ understand this line, esp. in context
RewriteBase /portfolio

// Don't ~fully~ understand this line
// I understand that its asking if the filename is a valid file or dir
// but is it overall saying if valid file or valid dir perform rewrite?
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d

// Don't understand, $1 is the STRING, and the rest the condition, but
// how do you read this condition?
RewriteCond $1 !^(index\.php|images|robots\.txt|css)

// Don't understand (but do understand the RewriteRule PATTERN REPLACE, but is it
// saying replace 'all' with index.php/all ?
RewriteRule ^(.*)$ index.php?/$1

1 个答案:

答案 0 :(得分:5)

Options -Multiviews 

这会禁用Multiviews Apache选项。基本上,该选项允许服务器根据客户端接受的内容类型和语言,使用不同的文件名在同一目录中查找内容。在这种情况下,该指令仅被禁用,以确保Apache不会提供任何意外文件。

Multiviews可启用内容协商,详情请参阅:http://httpd.apache.org/docs/current/content-negotiation.html

Options +FollowSymLinks

这可确保启用FollowSymLinks选项。此设置允许Apache跟踪目录中的符号文件链接(如果存在)。如果存在符号文件链接,则存在此设置,以使文件在服务器上的其他位置实际存在于请求之外。

更长的解释:http://www.maxi-pedia.com/FollowSymLinks

RewriteBase /portfolio

此设置用于定义重写引擎使用的URL的基本路径。当重写引擎重写.htaccess中的url时,它会删除当前目录的路径。一旦url重写完成,它将根据当前文件目录将其添加回来。但是,有时请求的URL与服务器本身上的目录结构没有相同的路径。 RewriteBase告诉rewritengine当前目录的URL路径是什么。在这种情况下,例如,文件可以存储在/foo/bar中,但可以通过浏览器访问www.example.com/portfolio。 RewriteBase告诉引擎将/portfolio添加到网址,而不是/foo/bar

有关完整说明,请参阅:http://httpd.apache.org/docs/current/mod/mod_rewrite.html#rewritebase(该网址还包含对.htaccess的其他重写部分的说明)。

RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d

这些行确保任何实际存在的文件或目录的URL都不会被重写。条件之前的!是否定的。所以这两个条件应该被理解为ifNotFile AND ifNotDirectory

RewriteCond $1 !^(index\.php|images|robots\.txt|css)

$1这里指的是实际重写的子模式捕获1。换句话说,它表示由RewriteRule中的(.*)捕获的部分。基本上,这个规则只是检查RewriteRule不会重写任何以“index.php”,“images”,“robots.txt”或“css”开头的url。

RewriteRule ^(.*)$ index.php?/$1

这简单地告诉重写引擎任何请求(当然不会被重写条件阻止)应该被重写为index.php?,并跟随它的实际请求。就像您说的那样,请求foo/bar将转发给index.php?foo/bar。关键是允许index.php处理文件请求(可以通过$_SERVER['QUERY_STRING']访问它们),这在CMS系统和框架中是非常常见的做法。

我希望这些解释会有所帮助。我对所有这些指令没有丰富的经验,因此可能存在轻微的不准确之处,如果有,请发表评论。