【问题标题】:How to set Apache conditional header based on URL?如何根据 URL 设置 Apache 条件标头?
【发布时间】:2017-03-14 16:21:20
【问题描述】:

我想根据 URL 设置不同的 HTTP 标头。在我的特殊情况下,我希望一个特定的 URL(例如正则表达式^/abc$)具有与其他所有不同的标题。

我正在尝试这个:

<IfModule mod_headers.c>
    <If "%{REQUEST_URI} =~ /^\/abc$/">
        Header set Content-Security-Policy: "default-src 'none'; style-src 'self' 'unsafe-inline';"
    </If>
    <Else>
        Header set Content-Security-Policy: "default-src 'none'; child-src https: *.youtube.com 'self'; connect-src 'self'; font-src 'self'; img-src 'self'; script-src https: *.ytimg.com *.youtube.com 'self'; style-src 'self';"
    </Else>
</IfModule>

但是这似乎不起作用,日志说:

Cannot parse condition clause: Failed to compile regular expression

我做错了什么,我该如何让它发挥作用?

我还尝试了备用正则表达式 m#^/abc$#,然后没有错误,但没有匹配 If 条件。

【问题讨论】:

    标签: regex apache .htaccess if-statement header


    【解决方案1】:

    使用If 这样的条件来评估正则表达式:

    <If "%{REQUEST_URI} =~ m#^/abc/?$#">
    

    编辑:在 Apache 2.4+ 上对我有用:

    <IfModule mod_headers.c>
        <If "%{THE_REQUEST} =~ m#\s/+abc/?[?\s]#">
            Header set Content-Security-Policy: "default-src 'none'; style-src 'self' 'unsafe-inline';"
        </If>
        <Else>
            Header set Content-Security-Policy: "default-src 'none'; child-src https: *.youtube.com 'self'; connect-src 'self'; font-src 'self'; img-src 'self'; script-src https: *.ytimg.com *.youtube.com 'self'; style-src 'self';"
        </Else>
    </IfModule>
    

    如果您使用的是较旧的 Apache,请使用此 mod_rewrite 技巧:

    RewriteEngine On
    
    RewriteCond %{THE_REQUEST} \s/+abc/?[\s?] [NC]
    RewriteRule ^ - [E=MYENV1:1]
    
    RewriteCond %{THE_REQUEST} !\s/+abc/?[\s?] [NC]
    RewriteRule ^ - [E=MYENV2:1]
    
    Header set Content-Security-Policy "default-src 'none'; style-src 'self' 'unsafe-inline';" env=MYENV1
    Header set Content-Security-Policy "default-src 'none'; child-src https: *.youtube.com 'self'; connect-src 'self'; font-src 'self'; img-src 'self'; script-src https: *.ytimg.com *.youtube.com 'self'; style-src 'self';" env=MYENV2
    

    【讨论】:

    • 在这种情况下可以使用 THE_REQUEST 变量。请参阅我的更新答案。
    • 那么 Apache 2.2 的解决方案是什么?
    • 太棒了。谢谢你。最后一个问题:是否有可能将两者合二为一,以便自动识别正确的 Apache 版本并基于此 - 拥有 2.4 解决方案或旧版本解决方案?
    • @anubhava 在您对 2.4 的编辑中,您能解释一下为什么语法会改变吗?为什么用\s 代替^ 等?
    【解决方案2】:

    这是取自documentation的单行替代方案:

    Header always set CustomHeader my-value "expr=%{REQUEST_URI} =~ m#^/special_path.php$#"
    

    【讨论】:

    • 这里的地雷是如果其中一个以上匹配,而不是在 anubhava 的答案中提出的 if/else
    猜你喜欢
    • 2014-03-21
    • 2014-02-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-09-20
    • 1970-01-01
    • 2014-05-16
    • 2018-05-13
    相关资源
    最近更新 更多