htaccess 檔案對不同的 uri 進行特定的重寫

htaccess 檔案對不同的 uri 進行特定的重寫

我的文件中有以下內容.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 的情況下工作?)

相關內容