htaccess - 我可以将RewriteCond添加到另一个RewriteCond

时间:2011-02-05 16:52:43

标签: .htaccess mod-rewrite

好的,我会把它剥掉,因为它很容易或不可能......

  • 网址= www.example.com/foldername/
  • USER IP = 203.0.113.111
  • 服务器上的文件夹= /2030113111-foldername/

的.htaccess

RewriteCond %{REMOTE_ADDR} ^([^.]+)\.([^.]+)\.([^.]+)\.([^.]+)?
RewriteCond ^%1%2%3%4-%{REQUEST_FILENAME} -d
RewriteRule ^. - [L,NC]

除非用户IP特定于所请求的foldername并且存在名为IP-URI的文件夹,否则这将保护文件夹查看。

需要专门使用HTACCESS的解决方案。

2 个答案:

答案 0 :(得分:1)

您只能为一个RewriteCond使用多个RewriteRule。只需将RewriteCond写在彼此之下,例如

RewriteCond foo bar
RewriteCond bar foo
RewriteRule .* example.org

只有在foo == barbar == foo为真(从不)时才会执行RewriteRule。 :)

答案 1 :(得分:0)

是的,你可以做这样的事情,但不像你那样做。您只需要使用正确的服务器变量。

RewriteCond ^%1%2%3%4-%{REQUEST_FILENAME} -d

此指令的问题在于REQUEST_FILENAME是绝对文件系统路径。因此,这有效地检查^2030113111-/home/user/public_html/foldername是否是一个有效的目录 - 这将失败。 TestString也是字符串,而不是正则表达式,因此^前缀也会破坏事物。

相反,你可以这样做:

RewriteCond %{REMOTE_ADDR} ^([^.]+)\.([^.]+)\.([^.]+)\.([^.]+)$
RewriteCond %{DOCUMENT_ROOT}/%1%2%3%4-$1 -d
RewriteRule (.+) - [L]

其中$1RewriteRule 模式匹配的网址路径。 RewriteRule 模式首先在其之前的RewriteCond指令之前处理。

为了测试我们正在检查的目录,您可以将其分配给环境变量并在脚本中进行检查。所以,为了测试:

RewriteCond %{REMOTE_ADDR} ^([^.]+)\.([^.]+)\.([^.]+)\.([^.]+)$
RewriteCond %{DOCUMENT_ROOT}/%1%2%3%4-$1 (.*)
RewriteRule (.+) - [E=DIRECTORY_CHECKING_FOR:%1,L]

检查脚本中的DIRECTING_CHECKING_FOR环境变量应显示如下内容:/home/user/public_html/2030113111-foldername,具体取决于您的文件系统结构。

请注意%1与之前的 CondPattern 中的最后匹配的组匹配(如果没有匹配的组,则不一定是上面的那个)。因此,%1 替换中的RewriteRule(.*)(我们正在检查的整个“目录名称”)匹配。而%1 TestString 中的RewriteCond与IP地址的第一个八位字节匹配。