Linux

將所有 URL 從 http 重定向到 https(使用 301 ),少數除外

  • October 3, 2019

我正在嘗試使用 .htaccess將所有 URL 從 301 重定向http://到。https://應排除一些動態生成的 URL。

我不想重定向的一些 URL範例

example.com/tt.php?xxx (where xxx can be any number)
example.com/top/xxx/site/xxx (where xxx can be any number or characters)

現在我的 .htaccess 看起來像這樣:

RewriteEngine On
RewriteCond %{HTTPS} off [OR]
RewriteCond %{HTTP_HOST} ^www\. [NC]
RewriteCond %{HTTP_HOST} ^(?:www\.)?(.+)$ [NC]
RewriteRule ^ https://%1%{REQUEST_URI} [L,NE,R=301]

如何“排除”我的動態 URL?

現在我的.htaccess樣子是這樣的:

如果這就是您文件中的全部內容,那麼您可以在現有的重定向規則之前為要排除的 URL.htaccess包含一些例外情況。

例如:

# Prevent further processing if requesting a URL of the form
# example.com/tt.php?xxx (where xxx can be any number)
RewriteCond %{QUERY_STRING} ^\d+$
RewriteRule ^tt\.php$ - [L]

# Prevent further processing if requesting a URL of the form
# example.com/top/xxx/site/xxx (where xxx can be any number or characters)
RewriteRule ^top/[^/]+/site/ - [L]

通過首先放置上述“例外” ,隨後的任何指令(即重定向)都將被跳過。


**更新:**如果您的.htaccess文件中有其他指令仍應適用於這些 URL,那麼您可以改為向現有重定向規則添加其他條件。

例如:

RewriteCond %{THE_REQUEST} !^[A-Z]{3,6}\s/tt\.php\?\d+\sHTTP
RewriteCond %{REQUEST_URI} !^/top/[^/]+/site/

RewriteCond %{HTTPS} off [OR]
RewriteCond %{HTTP_HOST} ^www\. [NC]
RewriteCond %{HTTP_HOST} ^(?:www\.)?(.+)$ [NC]
RewriteRule ^ https://%1%{REQUEST_URI} [L,NE,R=301]

請注意,前兩個條件在CondPattern!上有一個前綴,以否定其含義。因此,僅當正則表達式不匹配時,條件才成功。

請注意,我沒有像在第一個範例中那樣使用兩個指令 (RewriteCondRewriteRule) 來匹配 URL ,/tt.php?xxx而是將其組合成一個規則並匹配THE_REQUEST- 這是為了簡化這條規則中的邏輯。

THE_REQUESTserver 變數保存 HTTP 請求的第一行。

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