如果可能的話,我喜歡簡化代碼,但我對.htaccess不太熟悉,我有錯誤檔案重定向規則硬編碼
ErrorDocument 403 http://example.com/error/404
然后我做了它
ErrorDocument 403 http://%{HTTP_HOST}/error/404
我的問題是,為了使.htaccess不需要手動修改,有沒有辦法告訴它是https還是http? 因為上面的例子中,如果我使用https,就必須硬編碼https,我想自動檢查。
uj5u.com熱心網友回復:
不要在ErrorDocument指令中使用絕對URL
。
ErrorDocument 403 http://example.com/error/404
你不應該在ErrorDocument指令中使用一個絕對的URL! 這將觸發一個302回應(即一個302臨時重定向)到目標URL。因此,這不會在第一次回應時向用戶代理發送一個403(或404)回應。
(這種格式的ErrorDocument指令應該只在非常特殊的情況下使用,因為你也失去了很多關于首先觸發回應的URL的資訊。
為了在內部提供同一服務器上的自定義錯誤檔案,這應該是一個根相關的URL,以斜線開始(沒有方案或主機名)。例如:
ErrorDocument 403 /error/404
然而,/error/404不太可能是一個有效的端點。這應該代表一個可以被服務的有效資源。例如,/error/404.html。
(這就自然而然地解決了必須指定HTTP與HTTPS的問題。)
為了回答你的具體問題......
。因為上面的例子中,如果我使用https,就必須硬編碼https
。
(盡管可以說,如今你應該在任何地方都使用HTTPS。)
然而,為了實作你的要求,你可以使用REQUEST_SCHEME server變數做以下事情,例如:
ErrorDocument 403 %{REQUEST_SCHEME}://%{HTTP_HOST}/error/404
或者,如果REQUEST_SCHEME服務器變數不可用,那么你可以使用mod_rewrite從HTTPS服務器變數構建這個變數,并將其分配給environment變數。例如:
RewriteEngine On
RewriteCond %{HTTPS}s ^on(s)|
RewriteRule ^ - [E=PROTO:http%1] 。
ErrorDocument 403 %{reqenv:PROTO}://%{HTTP_HOST}/error/404
當HTTPS為on時,%1回參考包含s,否則為空。所以PROTO environment變數被設定為http或https。
這確實假定SSL是由應用服務器管理的,而不是由前端代理(如Cloudflare Flexible SSL等)。
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/328148.html
標籤:
上一篇:librosa和tensorflow之間對同一wav檔案的不同采樣率SR
下一篇:Openpyxl不修改單元格值
