簡體   English   中英

說服Apache的原始客戶端協議

[英]Convince Apache of the original client protocol

所以我有一個相對直接的服務器堆棧,利用SSL卸載和HTTP負載均衡器。 設置看起來像這樣:

(client) -> (SSL offload - stud) -> (balancer - haproxy) -> (http server - apache)

我的問題不是關於堵塞這一切。 它運作得很好,老實說,我很清楚它是如何直接設置它的。 我還要補充說,HTTP客戶端直接連接到haproxy,從而繞過SSL卸載。 並且為了記錄,上述每個部分都有冗余的合作伙伴。

問題有點抽象。 我將從演示開始。 客戶端通過設置向https://myserver.tld/scp發出請求(刪除了一些標題以保持清晰)

GET /scp HTTP/1.1
Host: myserver.tld
(headers added by haproxy)
X-Forwarded-For: [original::client:ip]
X-Forwarded-Proto: https

並且服務器響應

HTTP/1.1 301 Moved Permanently
Date: Wed, 03 Jul 2013 03:16:25 GMT
Server: Apache/2.2.15 (CentOS)
Location: http://myserver.tld/scp/
Content-Length: 344
Content-Type: text/html; charset=iso-8859-1

所以Apache mod_dir正在使用尾部斜杠向同一個URL發送重定向。 這樣做是正確的。 那不是問題。 問題是HTTPS協議丟失了。 同樣,我認為Apache重定向到HTTP URL是正確的,畢竟,從上述堆棧接收的連接是常規的HTTP連接。

因此,從Apache的角度來看,客戶端請求了常規的HTTP連接。 HTTPS標志以及所有其他SSL信息都處於關閉狀態,因為會話的SSL部分由stud處理。

雖然(在Apache內部)我有一個有效的X-Forwarded-Proto標頭,我找不到告訴Apache原始客戶端連接是HTTPS的方法,並且mod_dir的目錄斜線重定向應該使用https://協議。 我錯過了什么?

我唯一想到的是在haproxy中重寫Location頭,用於HTTPS轉發連接以用https://替換http:// https:// ,但我真的不認為這種方法非常優雅。 我更喜歡Apache(並且( 不要傷害我 )PHP進一步向下)以獲得通知並將連接視為普通的HTTPS連接。

請幫忙!

PS - 如果你不得不問,我之前聽過它說過,那你做錯了。 也許這就是根本問題,但這似乎是一個簡單的困境,我覺得這是唯一一個到過這里的人。

您可以通過在ServerName指令中包含協議來完成此操作:

ServerName https://my-server-name

根據Apache 文檔

有時,服務器在處理SSL的設備后面運行,例如反向代理,負載平衡器或SSL卸載設備。 在這種情況下,請在ServerName指令中指定客戶端連接的https://方案和端口號,以確保服務器生成正確的自引用URL。

  1. 目錄斜杠重定向:你想要的是mod_rewrite

     RewriteEngine On RewriteCond %{HTTP:X-Forwarded-Proto} =https RewriteCond %{REQUEST_FILENAME} -d RewriteRule ^(.+[^/])$ https://www.example.com/$1/ [R=301,L,QSA] 

    如果標頭設置為https且請求的文件名是目錄( -d ),則重寫(用您自己的域替換example.com )。

  2. 至於使PHP像普通HTTPS連接一樣處理連接,請將環境變量HTTPS設置為on

     SetEnvIf X-Forwarded-Proto https HTTPS=on 

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM