Mod-Rewrite

Apache 可以根據 URL 重寫請求的 Host 標頭嗎?

  • January 19, 2016

Apache 是我的應用程序的反向代理。客戶要求http://cdn.example.com/foo/images/logo.png

GET /foo/images/logo.png HTTP/1.1
Host: cdn.example.com

我希望 Apache 修改請求,以便反向代理另一端的應用程序以以下格式接收它http://foo.example.com/images/logo.png

GET /images/logo.png HTTP/1.1
Host: foo.example.com

重寫 URL 很容易,但我還沒有找到一種方法來使用從 URL 中提取的值來修改 Host 標頭。這可能嗎?

是的,您可以根據 URI 更改標頭。雖然它很醜 - 這是我知道的唯一方法:

  1. SetEnvIF如果 URI 與您要重寫的內容匹配,則用於設置環境變數。
  2. 如果設置了該環境變數,請使用mod_headersRequestHeader指令重置相應的請求標頭 ( ) 。Host:

使用上面提到的 SetEnvIf 和 Header,這是我重寫“Accept-Encoding”標頭以減少 mod_cache 創建的記憶體副本所做的工作,測試工作正常。

# rewrite variation of the Accept-Encoding header to the same one
# to reduce the caching copies
UnsetEnv compression_ok
SetEnvIfNoCase Accept-Encoding ".*gzip.*deflate.*" compression_ok=1
RequestHeader set Accept-Encoding "gzip,deflate" env=compression_ok

這是做什麼的:不同的瀏覽器對 Accept-Encoding 的設置略有不同,例如“gzip,deflate”與“gzip,deflate”(帶有額外空間),這些會導致 mod_cache 創建內容的不同副本。通過將其重寫為相同的值,mod_cache 只生成一份副本。(注意:我的伺服器只關心“gzip,deflate”,你的可能不同)。

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