为什么Apache的setEnvIf没有设置正确的头文件,以及如何进行debugging

我有我的.htaccess文件中的以下内容:

 <IfModule mod_headers.c> SetEnvIf Origin "http(s)?:\/\/(www\.)?(inreado\.local|testenv\.inreado\.com|inreado\.com)$" AccessControlAllowOrigin=$0$1 Header set Access-Control-Allow-Origin %{AccessControlAllowOrigin}e env=AccessControlAllowOrigin Header set Access-Control-Allow-Methods "PUT, GET, POST, DELETE, OPTIONS" Header set Access-Control-Allow-Credentials true </IfModule> 

我试图设置Access-Control-Allow-Origin头,如果主机是在正则expression式中指定的三个允许的域之一。 但它从来没有设置这个标题。 这是请求和回应:

请求

 GET http://inreado.local:8080/ HTTP/1.1 Host: inreado.local:8080 Connection: keep-alive Cache-Control: max-age=0 Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8 User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/41.0.2272.101 Safari/537.36 Accept-Encoding: gzip, deflate, sdch Accept-Language: en,en-US;q=0.8,ru;q=0.6 

响应

 HTTP/1.1 404 Not Found Date: Sun, 22 Mar 2015 09:44:17 GMT Server: Apache/2.4.10 (Win64) PHP/5.6.3 X-Powered-By: PHP/5.6.3 Access-Control-Allow-Methods: PUT, GET, POST, DELETE, OPTIONS Access-Control-Allow-Credentials: true Keep-Alive: timeout=5, max=100 Connection: Keep-Alive Transfer-Encoding: chunked Content-Type: text/html; charset=utf-8 

我testing了正则expression式对http://inreado.localstring在这里 ,它应该匹配,所以我不明白问题在哪里。

更新

 SetEnvIf Origin "http(s)?://(www\.)?(inreado\.local:8080)$" AccessControlAllowOrigin=$1$2 Header set Access-Control-Allow-Origin %{AccessControlAllowOrigin}e env=AccessControlAllowOrigin 

更新:显然,首先要做的是在你的请求中发送Origin标头。

您的正则expression式是"http(s)?:\/\/(www\.)?(inreado\.local|testenv\.inreado\.com|inreado\.com)$"

但我相信它根本不匹配,因为你需要添加端口到这个URL正则expression式(因为inreado.localinreado.local:8080是两个不同的起源)。 因此,由于envvariables未设置,所以您的标题指令被跳过。

所以:

  • 在请求中添加相关的Origin标头。
  • 将端口添加到您的正则expression式。

顺便说一句,在你的正则expression式中,不需要使用斜杠。