我的文件中有以下內容.htaccess
:
<IfModule mod_rewrite.c>
Options +FollowSymlinks
RewriteEngine On
# Block hidden directories
RewriteRule "(^|/)\." - [F]
# Prevent /health_check.php from using https
RewriteCond %{REQUEST_URI} !(health_check\.php)$
# Prevent /sns from using https but this DOES need codeigniter rewriting (see below)
RewriteCond %{REQUEST_URI} !^/(sns)/
# Reroute http to https
RewriteCond %{HTTP:X-Forwarded-Proto} =http
RewriteRule (.*) https://%{HTTP_HOST}%{REQUEST_URI} [R,L]
# Prevent rewriting of domain for codeigniter
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)$ ./index.php/$1 [L,QSA]
</IfModule>
除了部分之外,一切似乎都正常工作/sns
。我無法讓它停止重定向到 https。
我不想http://sub.example.com/sns
重定向http://sub.example.com/health_check.php
到 https。
答案1
# Prevent /sns from using https but this DOES need codeigniter rewriting (see below) RewriteCond %{REQUEST_URI} !^/(sns)/
如果請求 URL 不以尾部斜線結尾(如上所述),則上述規則(包括請求 URL 上的尾部斜線)條件模式)永遠會成功(這是一個否定的條件),因此重定向到 HTTPS 將始終發生。
理想情況下,您應該在請求的早期對尾隨斜線進行規範化。要么包含尾部斜杠,要么不包含(否則,它本質上是重複內容並且可能會導致其他解析 URL 的腳本出現問題)。
但是,要處理這兩個 URL /sns
,/sns/
您需要將尾部斜線設為可選並包含字串結尾錨點 ( ^
)。例如:
RewriteCond %{REQUEST_URI} !^/sns/?$
請注意,這僅符合指定的兩個 URL。它不會匹配表單的 URL /sns/<something>
。
我已經刪除了路徑段周圍的括號(您還應該刪除正規表示式中的其他括號)。這會建立一個捕獲的群組,並且在您發布的指令中是多餘的。
更新:您還需要進行額外的檢查,以確保重寫的 URL(即/index.php/sns
)不會被重新導向。您可以以更通用的方式執行此操作,只需在初始請求上套用 HTTPS 重定向,而不是在重寫的請求上套用,方法是新增一個附加條件:
# Only applies to direct requests (not rewritten requests)
RewriteCond {%ENV:REDIRECT_STATUS} ^$
第一次成功重寫後(即 CodeIgniter 路由),環境REDIRECT_STATUS
變數設定為「200」。它未在初始請求中設定(即^$
- 空字串)。
如果這仍然導致重定向,則 CodeIgniter 本身可能正在觸發重定向(在.htaccess
處理後)。
RewriteRule ^(.*)$ ./index.php/$1 [L,QSA]
在旁邊:正如我的評論中所述,您應該./
刪除RewriteRule
替代。請參閱我的回答結束在這個 StackOverflow 問題以獲得解釋。
概括
Options +FollowSymlinks
RewriteEngine On
# Block hidden directories
RewriteRule ^\. - [F]
# Only applies to direct requests (not rewritten requests)
RewriteCond {%ENV:REDIRECT_STATUS} ^$
# Prevent /health_check.php from using https
RewriteCond %{REQUEST_URI} !health_check\.php$
# Prevent /sns from using https but this DOES need codeigniter rewriting (see below)
RewriteCond %{REQUEST_URI} !^/sns/?$
# Reroute http to https
RewriteCond %{HTTP:X-Forwarded-Proto} =http
RewriteRule .* https://%{HTTP_HOST}%{REQUEST_URI} [R=301,L]
# Prevent rewriting of domain for codeigniter
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)$ index.php/$1 [L,QSA]
HTTP 到 HTTPS 的重定向最終應該是 301(永久)重定向,但只有在您確認其工作正常後才可以。該R
標誌本身預設為 302(暫時)重定向。
(你也不需要<IfModule>
包裝器,除非你的網站打算在沒有 mod_rewrite 的情況下工作?)