【问题标题】:Set multiple headers conditionally with rewrite rules [apache httpd.conf]使用重写规则有条件地设置多个标头 [apache httpd.conf]
【发布时间】:2017-12-17 18:13:34
【问题描述】:

我一直在尝试用很少的 RewriteCond 有条件地设置标题。似乎不太好用。

<IfModule mod_rewrite.c>
  RewriteEngine on
  RewriteLog "/tmp/rewrite.log"
  RewriteLogLevel 9

  RewriteCond %{HTTP_REFERER} "/id\:no\:"
  RewriteCond %{REQUEST_URI} "/live-stream/"

  RewriteRule ^.*$ - [ENV=stream:true]
  Header unset X-Frame-Options env=stream
  Header set Content-Security-Policy "frame-ancestors ‘self’ *.google.com:443 *.mydomain.com:443 mydomain2.com:443;” env=stream
</IfModule> 

两个条件都匹配,但在 curl 时重写规则似乎没有显示结果。它采用为其他 uri 设置的通用设置。

更新1: 我已经让未设置的字符串头工作了。

<IfModule mod_rewrite.c>
  RewriteEngine on
  RewriteLog "/tmp/rewrite.log"
  RewriteLogLevel 9

  RewriteCond %{HTTP_REFERER} "/id\:no\:"
  RewriteCond %{REQUEST_URI} "/live-stream/"
  RewriteRule ^ - [ENV=stream1:true]

  RewriteCond %{HTTP_REFERER} "/id\:no\:"
  RewriteCond %{REQUEST_URI} "/live-stream/"
  RewriteRule ^ - [ENV=stream2:true]

  Header set Content-Security-Policy "frame-ancestors ‘self’ *.google.com:443 *.mydomain.com:443 mydomain2.com:443;” env=stream2
</IfModule>

我已经设法通过在重写规则中使用 Env 变量来取消设置标题,并在它设置它的级别否定。

现在唯一不起作用的是 Content-Security-Policy 更改。

这是我得到的输出: $ curl -H '推荐人:https://www.example.net/buy/id:no:1234567' 'www.example.net/applications/buy/live-stream/list/en-us/ind‌​ex.html' -sS -o /dev/null -D -

HTTP/1.1 200 OK
Date: Tue, 19 Dec 2017 00:31:14 GMT
Content-Security-Policy: frame-ancestors 'self' *.google.com:443 *.mydomain.com:443 mydomain2.com:443;” env=stream2

【问题讨论】:

  • 您并没有真正在实际代码中使用 curly 单引号和双引号,对吧?
  • 我的使用方式与问题相同。
  • 在此处需要更多详细信息。 HTTP_REFERER 条件的目的是什么?点击/live-stream URI时浏览器显示的URL是什么,之后在浏览器URL中显示的是什么?
  • HTTP_REFERER 的示例为 www.mydomain.com/buy/id:no:1234567REQUEST_URI 的示例为 www.mydomain.com /applications/buy/live-stream/list/en-us/index.html
  • 这个 .htaccess 在哪里?那里有更多规则吗?

标签: php apache .htaccess mod-rewrite webserver


【解决方案1】:

试试这个代码,因为它对我有用:

RewriteCond %{HTTP_REFERER} "/id:no:" [NC]
RewriteCond %{REQUEST_URI} "/live-stream/" [NC]
RewriteRule ^ - [E=stream1:1,E=stream2:1]

Header set Content-Security-Policy "frame-ancestors ‘self’ *.google.com:443 *.mydomain.com:443 mydomain2.com:443;" env=stream2

确保在运行 curl 命令时没有收到任何 404。

试试这个curl 命令:

curl -IkL -H 'Referer: http://localhost/buy/id:no:1234567' 'localhost/applications/buy/live-stream/list/en-us/index.html'

【讨论】:

  • 谢谢,我也是这样做的。由于已经有一个带有 Content-Security-Policy 的标头,我不得不否定它并设置另一个要使用的标头。请检查我发布的解决方案。
  • Apache 版本为 2.2
【解决方案2】:

我已经设法将更改放入

<IfModule mod_rewrite.c>
 RewriteEngine on
 RewriteLog "/tmp/rewrite.log"
 RewriteLogLevel 9

 RewriteCond %{HTTP_REFERER} "/id\:no\:"
 RewriteCond %{REQUEST_URI} "/live-stream/"
 RewriteRule ^ - [ENV=stream1:true]

 RewriteCond %{HTTP_REFERER} "/id\:no\:"
 RewriteCond %{REQUEST_URI} "/live-stream/"
 RewriteRule ^ - [ENV=stream2:true]
</IfModule>

我已将标头条件与以前为正常请求存在的其他条件一起添加。

Header set X-Frame-Options "SAMEORIGIN" env=!stream1
Header set Content-Security-Policy "frame-ancestors *.mydomain.com:443;" env=!stream2
Header set Content-Security-Policy "frame-ancestors ‘self’ *.google.com:443 *.mydomain.com:443 mydomain2.com:443;” env=stream2

【讨论】:

  • 为什么要为相同的条件设置 stream1 和 stream2 变量?
  • 我已经添加了两个条件,因为我有两个标题。
  • 您可以将两个环境变量设置在同一个RewriteRule
  • @anubhava 如何将两个 ENV 变量添加到同一个 RewriteRule
  • 你可以这样做:RewriteRule ^ - [E=stream1:1,E=stream2:1]
猜你喜欢
  • 2014-02-01
  • 2014-09-01
  • 2014-02-11
  • 2012-04-20
  • 2012-10-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多