我有一个主域www.example.com
。
以及主域名下的以下子域名
support.example.com
test.example.com
此前两个子域名均运行良好。
但是在主域上安装 PHP 脚本后,只有主域可以工作,所有子域都将转到主域。
检查文件后.htaccess
我发现了以下代码:
RewriteEngine on
RewriteBase /
RewriteCond %{THE_REQUEST} /(.+?)\.php[\s?] [NC]
RewriteRule ^ %1 [R=301,L,NE]
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{DOCUMENT_ROOT}/$1.php -f
RewriteRule ^(.+?)/?$ $1.php [L]
RewriteCond %{HTTPS} off [OR]
RewriteCond %{HTTP_HOST} !^www\. [NC]
RewriteRule (.*) https://www.example.com%{REQUEST_URI} [R=301,L]
IndexIgnore *
这与不工作的子域名有关吗?
答案1
RewriteCond %{HTTPS} off [OR] RewriteCond %{HTTP_HOST} !^www\. [NC] RewriteRule (.*) https://www.example.com%{REQUEST_URI} [R=301,L]
您没有确切说明发生了什么或子域名指向哪里,因此这里可能存在其他问题。
但是,如果您的子域名指向与主域名相同的文件系统区域(或者可能是子目录),那么上述规则将重定向所有子域名www.example.com
- 因此子域名“丢失”。
根据您的要求,您可以通过仅检查example.com
而不是!^www\.
将 HTTP 到 HTTPS 重定向拆分为其自己的规则来解决此问题。例如:
# HTTP to HTTPS (including subdomains)
RewriteCond %{HTTPS} off
RewriteRule ^ https://%{HTTP_HOST}%{REQUEST_URI} [R=301,L]
# Canonical non-www to www redirect for main domain only
RewriteCond %{HTTP_HOST} ^(example\.com)\.?$ [NC]
RewriteRule ^ https://www.%1%{REQUEST_URI} [R=301,L]
测试前您需要清除浏览器缓存。(最好使用 302 - 临时 - 重定向进行测试以避免潜在的缓存问题。)
但是,这些指令的顺序也错了(这与子域名问题无关)。规范重定向(上文)需要删除前内部重写。因此,您的.htaccess
文件应按如下顺序排列:
IndexIgnore *
RewriteEngine On
RewriteBase /
# HTTP to HTTPS (including subdomains)
RewriteCond %{HTTPS} off
RewriteRule ^ https://%{HTTP_HOST}%{REQUEST_URI} [R=301,L]
# Canonical non-www to www redirect for main domain only
RewriteCond %{HTTP_HOST} ^(example\.com)\.?$ [NC]
RewriteRule ^ https://www.%1%{REQUEST_URI} [R=301,L]
# Remove ".php" extension on requested URL
RewriteCond %{THE_REQUEST} \s/(.+)\.php[\s?] [NC]
RewriteRule ^ /%1 [R=301,L,NE]
# Internally rewrite request to append ".php" extension
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{DOCUMENT_ROOT}/$1.php -f
RewriteRule ^(.+?)/?$ $1.php [L]