![](/img/trans.png)
[英]Implementing a Server/Client with HTTP protocol with Apache Thrift
[英]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。
目錄斜杠重定向:你想要的是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
)。
至於使PHP像普通HTTPS連接一樣處理連接,請將環境變量HTTPS
設置為on
:
SetEnvIf X-Forwarded-Proto https HTTPS=on
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.