簡體   English   中英

Apache ProxyPassReverse無法正確重寫Location標頭

[英]Apache ProxyPassReverse not rewriting Location header properly

我正在配置apache以將SSL請求代理到本地后端服務器。 這是虛擬主機的相關部分:

<VirtualHost *:443>

  ...

  SSLEngine on
  SSLCertificateFile /path/to/server.crt
  SSLCertificateKeyFile /path/to/server.key

  RewriteEngine On

  <Proxy balancer://unicornservers>
    BalancerMember http://127.0.0.1:8080
  </Proxy>

  # Redirect all non-static requests to unicorn
  RewriteCond %{DOCUMENT_ROOT}/%{REQUEST_FILENAME} !-f
  RewriteRule ^/(.*)$ balancer://unicornservers%{REQUEST_URI} [P,QSA,L]

  ProxyPassReverse / balancer://unicornservers/
  ProxyPreserveHost on

  ...

</VirtualHost>

當我使用curl訪問服務器( curl -vk https://example.com )時,后端服務器將按照預期的那樣執行到/login的重定向。

問題是,Apache無法正確重寫Location標頭。 它返回http://example.com/login而不是https://example.com/login的位置。

我的配置中是否有需要告訴apache使用https進行ProxyPassReverse重寫的地方?

原來我診斷不正確。 后端Web服務器(在本例中,它恰好是Rails)實際上是在明確指定http URL。 這是因為它使用傳入的請求參數來構建其重定向URL。 因此,由於啟用了ProxyPreserveHost ,因此可以正確獲取主機,但不能獲取協議。

要解決此問題,我在apache配置中添加了以下行:

RequestHeader set X-Forwarded-Proto "https"

這樣,后端Rails服務器就知道原始請求是通過SSL進行的,並且可以正確生成重定向URL。

暫無
暫無

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

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