了解.htaccess规则

时间:2014-05-09 02:18:09

标签: apache .htaccess

我正在尝试了解.htaccess文件中导致问题的规则。

规则是:

<IfModule mod_rewrite.c>
    Options +SymLinksIfOwnerMatch
    RewriteEngine on
    RewriteCond %{SCRIPT_FILENAME} !.?folder1.? [NC]
    RewriteRule .? "/home/user1/public_html/sitefolder/folder1/file.php" [L]
</IfModule>

我的理解是,如果用户访问不包含'folder1'的网址,这会打开/folder1/file.php吗?

2 个答案:

答案 0 :(得分:1)

  

我的理解是,在用户访问不包含&#39; folder1&#39;?

的网址时,这会打开/folder1/file.php。

那是对的。

来自mod_rewrite documentation的一些说明:

  

变量SCRIPT_FILENAME和REQUEST_FILENAME包含相同的值 - Apache服务器的内部request_rec结构的filename字段的值。第一个名称是众所周知的CGI变量名称,而第二个名称是REQUEST_URI的适当对应物(其中包含request_rec的uri字段的值)。

     

如果发生替换并且重写继续,则两个变量的值将相应更新。

这意味着条件检查字符串folder是否存在于此变量中的任何位置。

规则没有特别匹配,但目标是文件系统上文件的完全限定绝对路径。规则的目标可以是文件路径或URL路径,在这种情况下,它是文件路径。在确定哪个是哪个时,Mod_rewrite始终是最亮的,因此它可能与这个URL路径相混淆,但可能不是。

一旦请求被重写为/folder1/file.php,然后重写引擎循环,规则再次应用,但这次,%{SCRIPT_FILENAME}变量包含&#34; folder1&#34;而且规则没有适用。

答案 1 :(得分:0)

如果您想在URI不包含 folder1 (确切情况)时触发RewriteRule,您可以

RewriteEngine On
RewriteCond  %{REQUEST_URI}  !folder1 
RewriteRule ^(.*)$  /folder1/file.php

请注意,它不像您拥有的完整文件路径。现在,如果您要尝试做的是重写任何无法启动 {/ 1}} /folder1/...(IOW,坚持{{1}在缺少它的任何URI前面,因为你将你的应用程序移动到一个级别),它将是

/folder1/...

它还会从原始URL传输任何查询字符串。