我使用apache作爲我的應用程序Web服務器的代理,並希望即時更改與sessionid cookie關聯的域名。更改Cookie域
這個cookie有一個與它相關的.company.com域,我想用apache mod rewrite(或者一些類似的模塊),將域名透明地更改爲app.company.com。這可能嗎 ?如果是這樣,一個人會怎麼做呢?
我使用apache作爲我的應用程序Web服務器的代理,並希望即時更改與sessionid cookie關聯的域名。更改Cookie域
這個cookie有一個與它相關的.company.com域,我想用apache mod rewrite(或者一些類似的模塊),將域名透明地更改爲app.company.com。這可能嗎 ?如果是這樣,一個人會怎麼做呢?
我不知道任何提供此功能的模塊。所以我想你會需要使用mod_ext_filter來編寫自己的output filter,這樣做對你有幫助。
但是,如果您可以控制其他服務器,只需省略Cookie的域值即可,因此客戶端會自動選擇所請求的域作爲Cookie的域。
我最終創建了一箇中間頁面,通過javascript將cookie域更改爲代理服務器(通過省略域值),然後將用戶重定向到目標頁面。這似乎解決了這個問題。感謝您的回答。
您只能更改客戶端上的Cookie 的域名或在服務器上設置的域名。一旦設置了cookie,其路徑和域信息就只存在於客戶端上。因此,現有Cookie不能在服務器上更改其域,因爲該信息不會從客戶端發送到服務器。
例如,如果你有一個cookie,看起來像這樣在本地機器上:
MYCOOKIE:123, domain:www.test.com, path:/
您的服務器將只接收:
MYCOOKIE:123
在服務器上。爲什麼不發送路徑和域名?因爲瀏覽器會在客戶端上的信息,和犯規麻煩一起發送它,因爲它僅發送這個cookie到您的服務器如果的頁面是在www.test.com和路徑/。
由於它是您的服務器,因此您應該可以更改創建新Cookie的代碼。如果您覺得因爲某種原因需要在代碼之外執行此操作,則可以使用類似於以下內容的方法執行此操作,但是您必須準確查看您的Cookie是如何寫入標題以準確匹配的。使用Apache的mod_headers
在此可行的解決方案下面是一個未經考驗的猜測,:
<IfModule mod_headers.c>
Header edit Set-Cookie (.*)(domain=.company.com;)(.*) $1 domain=app.company.com; $2
</IfModule>
您還可以使用mod_headers
改變從客戶端接收cookie的,像這樣,如果需要的話:
<IfModule mod_headers.c>
RequestHeader edit Cookie "OLD_COOKIE=([0-9a-zA-Z\-]*);" "NEW_COOKIE_NAME=$1;"
</IfModule>
這隻會重命名您在請求中收到的Cookie。
ProxyPassReverseCookieDomain company.com app.company.com
或交換域(因爲你不明確定義哪些是內部/外部)。
裁判:https://httpd.apache.org/docs/2.4/en/mod/mod_proxy.html#ProxyPassReverseCookieDomain
如果你的Web應用程序被捕獲Host:
頭,並使用它來確定的cookie domain=
部分,你也可以考慮在Apache指令 ProxyPreserveHost On
從中繼Host:
頭客戶。
僅當您的應用程序被設計爲假定它的域名是無論客戶提出與主機頭工作。如果您的應用程序是其中之一,這不僅將解決您的cookies,但也可以是任何絕對URL應用程序生成,它可以爲您節省否則需要來enable mod_substitute
更改它在什麼時候完全架空?對於服務器還是客戶端?我不明白。 – 2011-02-07 15:30:49
在服務器上更改它。基本上,由於apache被配置爲代理服務器,客戶端和應用服務器之間的所有流量都通過apache服務器進行路由。而我試圖完成的是在Cookie到達客戶端之前,在apache代理中更改應用程序設置的cookie域。 – 2011-02-07 15:48:39
@user我明白了。我認爲這是大胖反向代理可以做的事 - 不知道Apache是否有能力做到這一點。不過,我仍然不確定自己爲什麼需要這個。出站請求不會首先爲代理域設置cookie嗎? – 2011-02-07 15:51:05