2010-07-13 77 views
19

我想重定向去http://example.comhttps://example.com需要重定向所有流量到https

同任何流量http://example.com/about

我認爲這將是這樣的:

RewriteCond %{HTTP_HOST} ^example\.com$ [NC] 
RewriteRule ^(.*)$ https://example.com/$1 [R=301,L] 
+1

如果您不想使用您的實際域名,請針對所有域名問題使用example.com。 – animuson 2010-07-13 17:31:09

+0

可能重複的[如何將所有HTTP請求重定向到HTTPS](http://stackoverflow.com/questions/4083221/how-to-redirect-all-http-requests-to-https) – Sadurnias 2016-02-11 06:12:55

回答

50

這適用於我:

RewriteEngine on 
RewriteCond %{HTTPS} off 
RewriteRule (.*) https://%{HTTP_HOST}%{REQUEST_URI} 

如果流量通過非SSL HTTP進入,則重定向到用戶最初嘗試訪問的任何頁面的HTTP等效項。它也不涉及任何mod_rewrite選項,所以它很容易閱讀。爲什麼大家都覺得需要明確設置重定向的HTTP代碼,並將其中一個重寫標記爲「最後一個」?說真的,在過去的幾天裏我看到了幾十個相同的htaccess規則。

+2

我認爲如果重寫是「糾正」動作,301響應可能比默認的302響應更合適,並且需要明確的聲明。就'L'而言,如果不再有任何進一步的規則匹配,就沒有必要了,但是如果這樣做的話,通過擦除新的方案/主機信息可以很容易地阻止重定向。考慮到大多數人「忘記」一半時間發佈其他規則集,這是更安全的選擇。如果沒有更多的規則,我同意這只是混亂,我真的不明白,當他們在文件中唯一的規則使用它... – 2010-07-13 19:23:18

+1

雖然這似乎工作,這是錯誤的:這因爲這依賴於客戶端發送的「主機」頭。此外,主機頭還可以包含端口:因此,如果客戶端請求中的主機頭包含端口:80,則該位置將具有端口:80,其中包含https,這是錯誤的。請參閱http://serverfault.com/questions/814153/apache-returning-wrong-location-header。從t-richards http://stackoverflow.com/a/27930928/1504300的答案似乎更好 – reallynice 2016-11-10 09:12:35

+0

@reallynice你可以硬編碼主機頭,以及?對於只有一個的服務器。通常你可能沒有訪問服務器主配置文件,但你有.htaccess權限,所以在這種情況下,我只是使用它,但硬編碼主機。 – eis 2017-01-15 15:24:39

7

根據Apache documentation,對於此任務,使用mod_aliasmod_rewrite更合適。也就是說,以重定向所有的HTTP流量HTTPS,一會:

<VirtualHost *:80> 
    ServerName www.example.com 
    Redirect permanent/https://www.example.com/ 
</VirtualHost > 

<VirtualHost *:443> 
    ServerName www.example.com 
    # ... SSL configuration goes here 
</VirtualHost > 

有兩點需要注意有關此配置:

  1. 你需要爲了訪問主服務器配置文件中查找該配置工作。 VirtualHost指令僅在「服務器配置」上下文中有效。
  2. 請記住,mod_rewrite指令是在mod_alias指令之前處理的。如果您的.htaccess文件中已有大量RewriteRule s,則最好使用mod_rewrite配置。
+0

在我的情況下,「重定向永久」必須是:'重定向永久http://www.example.com https:// www.example.com',否則在瀏覽器中我得到一個循環錯誤 – 2017-05-12 10:11:22

8

這是一個previous answer using .httaccess但增加在評論中提議的變更,以及一些從我:

RewriteEngine on 
RewriteBase/
RewriteCond %{HTTPS} !on 
RewriteRule (.*) https://my.domain.name%{REQUEST_URI} [L,R=301] 

注:

  • 這對於用戶不能訪問的情況下,到主配置,但有權訪問.htaccess規則。如果您有權訪問主配置,請使用mod_alias solution instead
  • 對於我來說,沒有定義RewriteBase,規則就沒有找到。明確定義它可以消除一些服務器設置的不明確性。
  • 至少在某些配置中,%{HTTPS}在使用http時未設置爲off,但爲空,因此!onoff更可靠。
  • 對於顯式主機名,您不依賴客戶端主機頭或服務器配置。但是,顯式主機名稱通常假定只有一個域要重定向。主機頭帶來一些相當大的問題,例如包含端口和客戶端提供的數據。如Apache Wiki所建議的另一種替代方案是使用%{SERVER_NAME}。如果你考慮使用它,請檢查this discussion的警告 - 它依賴於其他配置是正確的。
  • R=301表示它是永久重定向,因爲它通常意味着在這種情況下。如果您認爲這是暫時的,那麼可以省略或指定爲R=302
  • L表示它是應用於此請求的最後一條規則。如果您懷疑或知道在此之後還有其他規則您不想申請,請留下它。如果這是文件的唯一規則,您可以刪除它。
相關問題