【问题标题】:mod_rewrite httpd.conf: Block access to directories on HTTP_REFERERmod_rewrite httpd.conf:阻止访问 HTTP_REFERER 上的目录
【发布时间】:2014-01-11 23:04:55
【问题描述】:

我正在(学习)实现前端控制器模式,将所有请求重定向到 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]

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

【问题讨论】:

    标签: php regex apache mod-rewrite


    【解决方案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 标志来防止应用第二条规则。

    【讨论】:

    • 乔恩,感谢您的回复。您对问题 2 的解决方案放置在 &lt;Directory "/server/http"&gt; 容器(我的文档根目录)中,效果很好。但是,将问题 1 规则放在问题 2 规则之后的同一容器中会导致无限重定向循环,而以前不是这种情况。我想也许RewriteBase /,但不管有没有相同的行为。再次感谢您的帮助。
    • 我的立场是正确的;这已成为一个不同的问题:重定向适用于格式为domain.com/blah 的 URL,但不适用于www.domain.com/blah。您的原始答案解决了所提出的问题,被接受了。
    猜你喜欢
    • 2012-07-30
    • 2012-08-22
    • 2012-07-27
    • 1970-01-01
    • 1970-01-01
    • 2011-09-16
    • 1970-01-01
    • 2012-11-02
    • 2015-07-10
    相关资源
    最近更新 更多