【问题标题】:Apache conditional Header per Referer每个Referer的Apache条件标头
【发布时间】:2018-07-11 23:48:05
【问题描述】:

我在 NgINX 服务器上有这个配置,我需要在另一个运行 Apache 的 Web 服务器上有相同的规则。

NgINX

if ($http_referer !~ "^https?:\/\/.*\.sitea\.com.*|https?:\/\/.*?\.siteb\.com.*|https?:\/\/sub\.sitea\.com.*|?$") {
 add_header X-Frame-Options "DENY";
}

我尝试使用以下代码,但收到内部服务器错误

阿帕奇

<IfModule mod_headers.c>
  <If "%{HTTP_REFERER} !~ m#^https?:\/\/.*\.sitea\.com.*$#">
    Header append X-Frame-Options "DENY"
  </If>
</IfModule>

有人能帮忙找到正确的方法吗?

【问题讨论】:

  • 什么版本的 Apache?
  • 另外,error_log 里有什么东西吗?
  • @MrWhite 任何请求的标头仅显示“Apache”,没有任何版本号
  • @DusanBajic 我无权访问文件日志,
  • 听起来您的主机设置了更严格的ServerTokens 设置(通过默默无闻实现安全)。无论如何,检查服务器版本的原因正如@revo 指出的那样,Apache 表达式(如上所用)是 Apache 2.4+ 的新功能。服务器的错误日志也会包含此错误的详细信息。

标签: regex apache .htaccess nginx


【解决方案1】:

Expressions 随 Apache 2.4 一起提供。你的肯定比那更老。

【讨论】:

    【解决方案2】:

    我发现这个解决方案适用于旧 Apache 版本。

    RewriteEngine On
    RewriteCond %{HTTP_REFERER} !^https?:\/\/.*\.sitea\.com.*?$ [NC]
    RewriteRule ^ - [E=NOFRAME:1]
    Header append X-Frame-Options "DENY" env=NOFRAME
    

    通过这种方式,我可以根据授权域列表有条件地输入X-Frame-Options。 这是不使用内容安全策略规则的旧浏览器的故障恢复。 You can see here the full list.

    Header append Content-Security-Policy "frame-ancestors sitea.com"
    

    因此,现代浏览器将使用 CSP2 规则,较旧的浏览器使用 X-Frame-Options。感谢正则表达式,我们可以将此选项应用于允许的域列表。

    【讨论】:

    • RewriteCond %{THE_REQUEST} - 大概你应该检查HTTP_REFERER,就像你的问题一样?就目前而言(通过检查 THE_REQUEST),您的 condition 将始终为真(因此您的 X-Frame-Options 标头将始终设置)。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-09-06
    • 2010-12-08
    • 2014-02-11
    • 2011-04-25
    • 2014-01-10
    • 2014-08-12
    • 1970-01-01
    相关资源
    最近更新 更多