Dot-Htaccess

如何使用或_這ROR或替換為 .htaccess 文件?

  • May 15, 2021

總結[OR]標誌在不同伺服器上的工作不一致。詳情和問題如下。

我有一個託管在 Godaddy 上的網站,我為.htaccess文件編寫了此程式碼,以將使用者重定向到https我的網站版本。它工作得很好。

<IfModule mod_rewrite.c>
   RewriteEngine On
   RewriteCond %{HTTPS} off [OR]
   RewriteCond %{HTTP_HOST} !^www\. [NC]   
   RewriteRule ^(.*)$ https://www\.firstsite\.com%{REQUEST_URI} [R=301,L]
</IfModule>

我將相同的.htaccess文件用於託管在 Network Solutions 上的不同站點,但它使站點崩潰。它產生了這個錯誤。

此頁面無法正常工作

www.secondsite.com 將您重定向了太多次。

ERR_TOO_MANY_REDIRECTS

我刪除了[OR]網路解決方案站點的標誌,並且載入的站點沒有錯誤。這是更新的程式碼。

<IfModule mod_rewrite.c>
   RewriteEngine on
   RewriteCond %{HTTPS} off
   RewriteCond %{HTTP_HOST} !^www\. [NC]
   RewriteRule ^(.*)$ https://www\.secondsite\.com%{REQUEST_URI} [R=301,L]
</IfModule>

不幸的是,沒有[OR]它,它不會根據第一個條件重定向,RewriteCond %{HTTPS} off. 但是它仍然根據第二個條件重定向RewriteCond %{HTTP_HOST} !^www\. [NC]

我不知道如何解決這個問題。我需要,[OR]但我不能使用它。有沒有辦法以[OR]不同的方式使用,或者有沒有替代這種情況的方法?非常感謝!

[OR]標誌在不同伺服器上的工作不一致。

這是(幾乎)不可能的。該OR標誌是 mod_rewrite 中的基本構造/操作符。如果這個結構不能正常工作,那麼你的伺服器就會出現嚴重問題,需要重新安裝或尋找新的主機。這種情況實在是太不可能了。

但是,更有可能的是 OR 表達式中的一個操作數與您期望的不一樣。IE。在這種情況下,伺服器變數之一HTTPSHTTP_HOST未按預期設置。在這兩者中,更有可能HTTPS沒有設置伺服器變數(或未按預期設置) - 正如我在評論中提到的那樣。這很“正常”,取決於您的伺服器配置以及 SSL 證書的管理方式。例如。如果您的 SSL 證書由前端代理(如 CloudFlare)管理,則HTTPS可能未設置伺服器變數。這似乎與您看到的結果一致。

調試

以下提示僅用於幫助進行初始調試以找到最終解決方案。

注意:在測試時,最好使用臨時 (302) 重定向,它不會被瀏覽器記憶體。301(永久)重定向被瀏覽器硬記憶體,所以你必須確保記憶體被禁用,這會給測試帶來問題。請確保在繼續之前清除記憶體。

  1. 嘗試(暫時)將其更改為 HTTP 到 HTTPS(僅)重定向,即。刪除 www 規範化。你還有重定向循環嗎?例如:
RewriteCond %{HTTPS} off
RewriteRule ^ https://www.example.com%{REQUEST_URI} [R,L]

旁白:在RewriteRule 替換中不需要轉義點- 這是一個普通的字元串,而不是正則表達式。) 2. 如果上述觸發了重定向循環,則檢查伺服器變數HTTPS包含的內容。IE。刪除上面的 HTTP 到 HTTPS 重定向並添加以下內容:

RewriteRule ^foo$ /?HTTPS=%{HTTPS} [R,L]

並直接訪問 URL https://example.com/foo。您應該被重定向到https://example.com/?HTTPS=<value>. 是什麼<value>?(<value>可能是空的。) 3. 檢查您的應用程序看到的 HTTP 請求標頭。如果您使用的是 PHP,請檢查$_SERVER和超全域數組,並$_ENV專門檢查索引HTTPSSERVER_PORT和(對應於標頭 - 如果已設置)。但是,很可能還有其他特定於您的伺服器的。例如,一些主機設置了一個名為的環境變數(而不是同名的伺服器變數)。將您發現的內容添加到您的問題中。SCRIPT_URI``HTTP_X_FORWARDED_PROTO``X-Forwarded-Proto``HTTPS

如果您看到X-Forwarded-Proto請求標頭,則說明您位於前端代理的後面,例如StackOverflow 上的這個問題

另請參閱Pro Webmasters 上的這個問題,了解類似的“討論”和最終解決方案。


更新: ……一個託管在網路解決方案上的網站……

我剛剛對“網路解決方案”(NS)進行了一些探勘,看來這可能是不可能的!?如果這是真的,我覺得這完全令人震驚,但是,我認為它仍然必須取決於安裝 SSL 證書的方式和類型?

(仍然檢查上面提到的 HTTP 請求標頭和伺服器/腳本變數。)

但是,關於 SSL 重定向的網路解決方案支持文件指出:

Network Solutions® 使用代理 SSL,這不允許使用伺服器端變數來檢測 HTTPS(安全)。所有伺服器端編碼將始終檢測 HTTP(非安全),並且對於嘗試將非安全連接 ( http://) 重定向到安全連接 ( https://) 的程序將在 30 秒後導致無限循環和伺服器錯誤。

您可以使用客戶端程序(如 javascript)來檢測它是否安全,如果不安全則重定向。您可以使用以下編碼來創建重定向。只需修改程式碼,使其重定向到正確的安全域並將其添加到您可能擁有的任何敏感頁面的 HTML 中。

<script language="javascript">
if (document.location.protocol != "https:")
{
document.location.href = "https://subdomain.yourdomain.com" + 
document.location.pathname;
};
</script>

“代理 SSL”應該標識自己,或者至少標識對應用程序伺服器的“代理”請求中的 HTTPS 狀態。但是,這意味著它沒有。

另請參閱 StackOverflow 上的以下相關問題。但是,那裡提出的“其他”解決方案似乎不可行 IMO。最終的結論似乎是對來自 NS 的上述支持文件(和 JavaScript 解決方案)的引用。

https://stackoverflow.com/questions/4686668/https-redirect-for-network-solutions

引用自:https://serverfault.com/questions/870532