我找到了很多類似的答案,但到目前為止我無法解決我想要的正確問題。這似乎很容易,或者也許有人已經回答了,但對我來說它不起作用。
我已經解決了在 TLD 上重定向到 https (http://example.comtohttps://www.example.com和https://example.comto https://example.com)
但是我的 htaccess 代碼不會重定向到https://www.example.com/whateverfromhttp://example.com/whatever或https://example.com/whatever.
換句話說,一切都必須重定向到https://www
這是我的.htaccess:
RewriteCond $1 !^(index\\.php|resources|robots\\.txt)
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)$ index.php?/$1 [L,QSA]
RewriteCond %{HTTPS} off
RewriteRule ^(.*)$ https://www.%{HTTP_HOST}/$1 [R=301,L]
RewriteCond %{HTTP_HOST} !^www\. [NC]
RewriteRule .* https://www.%{HTTP_HOST}%{REQUEST_URI} [L,R=301]
我在 config.php 中使用 codeigniter 3.11
$config['base_url'] = ((isset($_SERVER['HTTPS']) && $_SERVER['HTTPS'] == "on") ? "https" : "http");
$config['base_url'] .= "://".$_SERVER['HTTP_HOST'];
$config['base_url'] .= str_replace(basename($_SERVER['SCRIPT_NAME']),"",$_SERVER['SCRIPT_NAME']);
我的有什么錯誤.htaccess嗎?
uj5u.com熱心網友回復:
我已經解決了在 TLD 上重定向到 https (
http://example.comtohttps://www.example.com和https://example.comtohttps://example.com)
(我假設您的意思https://www.example.com/是最后一個 URL。而“TLD”實際上是指“根目錄”(或“檔案根目錄”或“主頁”)。)
這樣做的唯一原因是index.php在請求檔案根目錄時沒有觸發第一條規則(內部重寫到 - 前端控制器)。(index.php在這種情況下由 mod_dir 提供服務。)
但是,您似乎沒有測驗過http://www.example.com/(HTTP www),這會導致重定向到https://www.www.example.com(將 www 加倍)損壞。
RewriteCond $1 !^(index\\.php|resources|robots\\.txt) RewriteCond %{REQUEST_FILENAME} !-f RewriteCond %{REQUEST_FILENAME} !-d RewriteRule ^(.*)$ index.php?/$1 [L,QSA] RewriteCond %{HTTPS} off RewriteRule ^(.*)$ https://www.%{HTTP_HOST}/$1 [R=301,L] RewriteCond %{HTTP_HOST} !^www\. [NC] RewriteRule .* https://www.%{HTTP_HOST}%{REQUEST_URI} [L,R=301]
您的規則順序完全錯誤。規范重定向需要在重寫 CI 前端控制器之前進行,否則它們根本不會針對對非資產的請求進行處理(因為請求index.php首先被路由到 CI 前端控制器)。
但是,規范重定向本身的順序也錯誤(和/或不正確),因為http://www.example.com/(HTTP www)的請求將被錯誤地重定向到https://www.www.example.com/(如上所述)。
另外:您在第一個條件(指令)的正則運算式( CondPattern)中也有錯誤的雙反斜杠。這將匹配文字反斜杠 - 這永遠不會發生,所以第一個條件總是成功的(因為它是一個否定運算式)。RewriteCond
您的規則應該是這樣的:
# Canonical redirects
# non-www to www (and HTTPS)
RewriteCond %{HTTP_HOST} !^www\. [NC]
RewriteRule ^ https://www.%{HTTP_HOST}%{REQUEST_URI} [L,R=301]
# HTTP to HTTPS
RewriteCond %{HTTPS} off
RewriteRule ^ https://%{HTTP_HOST}%{REQUEST_URI} [R=301,L]
# Front-controller
RewriteCond $1 !^(index\.php|resources|robots\.txt)
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule (.*) index.php?/$1 [L,QSA]
這假設您沒有通過最小化規范重定向的數量來實作HSTS 。(如果您確實實施了 HSTS,那么您需要顛倒上面的兩個規則 - 規范重定向 - 因為您需要首先在同一主機上從 HTTP 重定向到 HTTPS - 這可能會在請求 HTTP 非 www 時導致兩次重定向。)
我還修改了 HTTP 到 HTTPS 重定向以與您的非 www 到 www 規則一致,即。使用REQUEST_URI服務器變數而不是反向參考。REQUEST_URI出于某種原因,您使用不同的正則運算式在一個和另一個中使用反向參考。^比.*這里更有效,因為您只需要規則成功,您不需要實際匹配任何內容。
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/510593.html
