好的,我会把它剥掉,因为它很容易或不可能......
www.example.com/foldername/
203.0.113.111
/2030113111-foldername/
RewriteCond %{REMOTE_ADDR} ^([^.]+)\.([^.]+)\.([^.]+)\.([^.]+)?
RewriteCond ^%1%2%3%4-%{REQUEST_FILENAME} -d
RewriteRule ^. - [L,NC]
除非用户IP特定于所请求的foldername并且存在名为IP-URI的文件夹,否则这将保护文件夹查看。
需要专门使用HTACCESS的解决方案。
答案 0 :(得分:1)
您只能为一个RewriteCond
使用多个RewriteRule
。只需将RewriteCond
写在彼此之下,例如
RewriteCond foo bar
RewriteCond bar foo
RewriteRule .* example.org
只有在foo == bar
和bar == 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]
其中$1
是RewriteRule
模式匹配的网址路径。 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地址的第一个八位字节匹配。