.htaccess htaccess重定向到在codeigniter 3中不工作的https

1szpjjfi  于 2022-11-16  发布在  其他
关注(0)|答案(1)|浏览(164)

我找到了很多类似的答案,但到目前为止,我还不能解决我想要的正确的事情。这似乎很容易,也许有人已经回答了,但对我来说,它不工作。
我已经解决了在TLD上重定向到https的问题(http://example.comhttps://www.example.comhttps://example.comhttps://example.com
但是我的htaccess代码没有从http://example.com/whateverhttps://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有什么错误吗?

v7pvogib

v7pvogib1#

我已经解决了在TLD上重定向到https的问题(http://example.comhttps://www.example.comhttps://example.comhttps://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加倍)。

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/(如上所述)。

  • 旁白:* 在第一个 conditionRewriteCond指令)的正则表达式(CondPattern)中也有错误的双反斜杠。这将匹配一个文字反斜杠--这永远不会发生,所以第一个 *condition**总是 * 成功的(因为它是一个求反表达式)。

您的规则应该如下所示:

# 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服务器变量而不是backreference。由于某些原因,您在一个中使用了backreference,而在另一个中使用了REQUEST_URI,使用了不同的regex。^.*更高效,因为您只需要规则成功即可。您不需要实际匹配任何内容。

相关问题