Apache-2.2

為什麼 Apache 的 setEnvIf 沒有設置正確的標頭以及如何調試它

  • March 22, 2015

我的.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如果主機是正則表達式中指定的三個允許域之一,我正在嘗試設置標頭。但它從來沒有設置這個標題。這是請求和響應:

要求

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

我已經在這裡http://inreado.local針對字元串測試了正則表達式,它應該匹配,所以我不明白問題出在哪裡。

更新

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

**更新:**顯然,要做的第一件事是Origin在您的請求中發送標頭…

你的正則表達式是"http(s)?:\/\/(www\.)?(inreado\.local|testenv\.inreado\.com|inreado\.com)$"

但我相信它根本不匹配,因為您需要將埠添加到這個 URL 正則表達式(因為inreado.localinreado.local:8080是兩個不同的來源)。因此,由於未設置 env 變數,因此跳過了您的 header 指令。

所以 :

  • Origin在您的請求中添加相關標頭。
  • 將埠添加到您的正則表達式。

順便說一句,在您的正則表達式中不需要轉義斜杠。

引用自:https://serverfault.com/questions/677339