mod_rewrite httpd.conf:阻止访问HTTP_REFERER上的目录

时间:2014-01-11 23:04:55

标签: php regex apache mod-rewrite

我(学习)实现Front Controller模式,将所有请求重定向到index.php并通过httpd.conf中的mod_rewrite规则作为查询字符串附加(稍后由PHP解析),如下所示:

RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^(.*)$ /index.php/$1 [NC,L]

问题1:这也是重定向所需的现有文件,例如domain.com/css/main.css!-d!-f不应该阻止此行为吗?

问题2:我想阻止访问(403)某些目录及其内容 - domain.com/css/*domain.com/js/*等 - 除非请求来自{ {1}}。

博览会

我有以下规则阻止基于domain.com的请求(来自博客,找不到链接......),这本身就阻止了所有用户请求:

HTTP_REFERER

我想添加另一个条件,检查REQUEST_URI是否适用于那些目录中的任何内容,但是无法使其工作。如果我添加以下内容:

RewriteCond %{HTTP_HOST}@@%{HTTP_REFERER} !^([^@]*)@@https?://\1/.*
RewriteRule ^.*$ - [F]

然后重定向所有内容;没有它,一切被阻止。因此,完整的mod_rewrite设置如下:

RewriteCond %{REQUEST_URI} /?.*(css|js)/?.* [NC]

非常感谢任何帮助;我一整天都在寻找答案。

1 个答案:

答案 0 :(得分:1)

  

问题1:这也是重定向所需的现有文件,例如domain.com/css/main.css!-d!-f不应该阻止此行为吗?

应该这样,但mod_rewrite可能没有正确的上下文。服务器配置中的重写规则与例如htaccess文件的行为略有不同。尝试将规则放在<Directory>容器中:

<Directory "/path/to/your/docuemntroot">

    RewriteCond %{REQUEST_FILENAME} !-d
    RewriteCond %{REQUEST_FILENAME} !-f
    RewriteRule ^(.*)$ /index.php/$1 [NC,L]

</Directory>

对于问题2,您只需将正则表达式添加到规则本身:

RewriteCond %{HTTP_HOST}@@%{HTTP_REFERER} !^([^@]*)@@https?://\1/.*
RewriteRule \.(css|js)$ - [F,L,NC]

并确保使用L标记以防止第二条规则被应用。