我找到了很多类似的答案,但到目前为止,我还不能解决我想要的正确的事情。这似乎很容易,也许有人已经回答了,但对我来说,它不工作。
我已经解决了在TLD上重定向到https的问题(http://example.com
到https://www.example.com
和https://example.com
到https://example.com
)
但是我的htaccess代码没有从http://example.com/whatever
或https://example.com/whatever
重定向到https://www.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
有什么错误吗?
1条答案
按热度按时间v7pvogib1#
我已经解决了在TLD上重定向到https的问题(
http://example.com
到https://www.example.com
和https://example.com
到https://example.com
)(我想你指的是最后一个URL中的
https://www.example.com/
。而“TLD”实际上是指“根目录”(或“文档根目录”或“主页”)。)这起作用的唯一原因是当请求文档根时没有触发第一个规则(对
index.php
-前端控制器的内部重写)。(在本例中,index.php
由mod_dir代替。)但是,您似乎没有测试
http://www.example.com/
(HTTP + www),这将导致到https://www.www.example.com
的重定向中断(www加倍)。您的规则顺序完全错误。规范重定向需要在您重写到CI前端控制器 * 之前 *,否则它们根本不会为对非资产的请求进行处理(因为请求首先被路由到
index.php
-CI前端控制器)。然而,规范重定向本身也处于错误的顺序(和/或不正确的),因为对
http://www.example.com/
(HTTP + www)的请求将被错误地重定向到https://www.www.example.com/
(如上所述)。RewriteCond
指令)的正则表达式(CondPattern)中也有错误的双反斜杠。这将匹配一个文字反斜杠--这永远不会发生,所以第一个 *condition**总是 * 成功的(因为它是一个求反表达式)。您的规则应该如下所示:
这是假设您 * 没有 * 通过最小化规范重定向的数量来实现HSTS。(如果您确实实现了HSTS,那么您需要颠倒上述两个规则-规范重定向,因为您需要 * 首先 * 在同一主机上从HTTP重定向到HTTPS-这可能会在请求HTTP +非www时导致两个重定向。)
我还修改了HTTP到HTTPS的重定向,使其与您的非www到www规则保持一致,即使用
REQUEST_URI
服务器变量而不是backreference。由于某些原因,您在一个中使用了backreference,而在另一个中使用了REQUEST_URI
,使用了不同的regex。^
比.*
更高效,因为您只需要规则成功即可。您不需要实际匹配任何内容。