Htaccess 重定向 http>https CI3

问题描述 投票:0回答:1

我目前有这样一个htaccess文件,它将通配符子域(例如name.domain.com)重定向到domain.com/account/company/name。

RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)$ index.php?/$1 [L]

RewriteCond %{HTTP_HOST} !^www\.example.org
RewriteCond %{HTTP_HOST} ^(.+).example.org
RewriteRule ^([^/]*)$ http://example.org/account/name/%1 [P,L,QSA]

但是,当我尝试添加从 HTTP 到 HTTPS 的重定向时,之前的重定向停止工作...

RewriteCond %{HTTP_HOST} off
RewriteRule .* https://%{HTTP_HOST}%{REQUEST_URI}

我得到的不是 https://name.example.org,而是 https://example.org/account/company/name。如何设置 HTTP 到 HTTPS 重定向以与之前的规则一起工作?

.htaccess codeigniter https http-redirect
1个回答
0
投票

问题是你把规则的顺序弄错了。 “先前的重定向”并没有“停止工作”,只是它发生在从 HTTP 到 HTTPS 的规范重定向之前任何规范重定向(即 HTTP 到 HTTPS)都需要位于

.htaccess

文件中的第一个位置。

您还应该将请求代理到 HTTPS,而不是 HTTP。

我假设您还有一个涵盖所有通配符子域的通配符 SSL 证书,否则您自然会收到 SSL 证书浏览器错误。

您的规范重定向需要放在第一位。但是,您现有的规则的顺序也是错误的 - 除非对子域的所有请求都恰好映射到物理文件和目录?

HTTP 到 HTTPS 的重定向也应该是 301(尽管您应该首先使用 302

test

),并且还必须包含 L 标志(因为它不再是最后一条规则)。

例如:

RewriteCond %{HTTP_HOST} off RewriteRule ^ https://%{HTTP_HOST}%{REQUEST_URI} [R=301,L] RewriteCond %{HTTP_HOST} !^www\.example.org RewriteCond %{HTTP_HOST} ^(.+).example.org RewriteRule ^([^/]*)$ https://example.org/account/name/%1 [P] RewriteCond %{REQUEST_FILENAME} !-f RewriteCond %{REQUEST_FILENAME} !-d RewriteRule (.*) index.php?/$1 [L]

但是,第二条规则看起来确实有点奇怪。您将对单路径段 URL 的所有请求“代理”到子域的名称。是否需要成为反向代理?主域和所有“通配符”子域不是都指向文件系统上的同一位置吗? (
旁白:

该规则不需要 L

QSA
标志。)
    

© www.soinside.com 2019 - 2024. All rights reserved.