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.phphttps://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。