HTTP 到 HTTPS 重定向公开子目录而不是重定向到子域
HTTP to HTTPS redirect exposes subdirectory instead of redirecting to subdomain
经过几个小时的研究,我放弃了!
当我键入以下内容时:https://scan.example.com
(注意 HTTPS
)它工作正常。
但是当我在浏览器中输入:http://scan.example.com
它转到:https://example.com/scan
(它把子域放在末尾)
如何防止这种情况并确保它进入 https://scan.example.com
?
这是我当前的 .htaccess
(除了上述问题,它对我来说非常适合其他所有问题):
Options -MultiViews
RewriteEngine On
# HTTP to HTTPS canonical redirect
RewriteCond %{HTTP_HOST} example\.com [NC]
RewriteCond %{SERVER_PORT} 80
RewriteRule (.*) https://example.com/ [R=301,L]
# Abort early if the request already maps to (or looks like) a file or directory
RewriteCond %{REQUEST_URI} \.\w{2,4}$ [OR]
RewriteCond %{REQUEST_FILENAME} -f [OR]
RewriteCond %{REQUEST_FILENAME} -d
RewriteRule ^ - [L]
# 3. Extensionless URLs for other requests
RewriteCond %{DOCUMENT_ROOT}/.php -f
RewriteRule (.*) .php [L]
*PS:我有 example.com/
的原因是因为我希望能够像这样在 root 中访问 account.php
:
https://example.com/account
.
我假设你的 .htaccess
文件位于 example.com
主机的根目录中,其中 /scan
是一个子目录(子域可能指向)?这个 .htaccess
文件应该同时适用于域顶点和子域?
在这种情况下,您需要在 substitution 字符串中使用 REQUEST_URI
服务器变量而不是 </code> 反向引用。因为当您请求子域时 <code>
反向引用将包含 /scan
子目录。
请尝试以下操作:
# HTTP to HTTPS canonical redirect
RewriteCond %{HTTP_HOST} example\.com [NC]
RewriteCond %{SERVER_PORT} 80
RewriteCond %{HTTP_HOST} ^(?:www\.)?(.+?)\.?$ [NC]
RewriteRule ^ https://%1%{REQUEST_URI} [R=301,L]
请注意为什么您有第一个 条件,除非您托管多个域?
以上将删除 www
子域,但会保留任何其他子域,包括 scan
。但是,这并没有专门将 www 规范化为 non-www,因为它只重定向 HTTP。
经过几个小时的研究,我放弃了!
当我键入以下内容时:https://scan.example.com
(注意 HTTPS
)它工作正常。
但是当我在浏览器中输入:http://scan.example.com
它转到:https://example.com/scan
(它把子域放在末尾)
如何防止这种情况并确保它进入 https://scan.example.com
?
这是我当前的 .htaccess
(除了上述问题,它对我来说非常适合其他所有问题):
Options -MultiViews
RewriteEngine On
# HTTP to HTTPS canonical redirect
RewriteCond %{HTTP_HOST} example\.com [NC]
RewriteCond %{SERVER_PORT} 80
RewriteRule (.*) https://example.com/ [R=301,L]
# Abort early if the request already maps to (or looks like) a file or directory
RewriteCond %{REQUEST_URI} \.\w{2,4}$ [OR]
RewriteCond %{REQUEST_FILENAME} -f [OR]
RewriteCond %{REQUEST_FILENAME} -d
RewriteRule ^ - [L]
# 3. Extensionless URLs for other requests
RewriteCond %{DOCUMENT_ROOT}/.php -f
RewriteRule (.*) .php [L]
*PS:我有 example.com/
的原因是因为我希望能够像这样在 root 中访问 account.php
:
https://example.com/account
.
我假设你的 .htaccess
文件位于 example.com
主机的根目录中,其中 /scan
是一个子目录(子域可能指向)?这个 .htaccess
文件应该同时适用于域顶点和子域?
在这种情况下,您需要在 substitution 字符串中使用 REQUEST_URI
服务器变量而不是 </code> 反向引用。因为当您请求子域时 <code>
反向引用将包含 /scan
子目录。
请尝试以下操作:
# HTTP to HTTPS canonical redirect
RewriteCond %{HTTP_HOST} example\.com [NC]
RewriteCond %{SERVER_PORT} 80
RewriteCond %{HTTP_HOST} ^(?:www\.)?(.+?)\.?$ [NC]
RewriteRule ^ https://%1%{REQUEST_URI} [R=301,L]
请注意为什么您有第一个 条件,除非您托管多个域?
以上将删除 www
子域,但会保留任何其他子域,包括 scan
。但是,这并没有专门将 www 规范化为 non-www,因为它只重定向 HTTP。