我目前有这样一个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 重定向以与之前的规则一起工作?
问题是你把规则的顺序弄错了。 “先前的重定向”并没有“停止工作”,只是它发生在从 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
标志。)