繁体   English   中英

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

[英]mod_rewrite httpd.conf: Block access to directories on HTTP_REFERER

我正在(学习)实现前端控制器模式,将所有请求重定向到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/* ,等等-除非请求来自domain.com

解释

我有以下规则来阻止基于HTTP_REFERER请求(来自博客,找不到链接...),该规则本身会阻止所有用户请求:

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

我想添加另一个条件,检查REQUEST_URI是否用于那些目录中的任何内容,但是在使其工作时遇到了麻烦。 如果我添加以下内容:

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

然后一切都被重定向; 没有它, 一切都会被阻塞。 因此,完整的mod_rewrite集如下所示:

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

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

任何帮助将不胜感激; 我整天都在寻找答案。

问题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标志来防止应用第二条规则。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM