![](/img/trans.png)
[英]redirect folder subdomain to subdomain.domain.com in htaccess
[英]http to https AND //domain.com to www.domain.com AND subdomain.domain.com to subdomain.domain.com through htaccess
我希望有人可以帮助我,因为多年来我一直在尝试不同的重定向方法,并且在我正在进行的项目中遇到了一个有趣的方法。
I need HTTP to redirect to HTTPS AND I need non-www to redirect to www but only if //domain.com without any subdomains AND I need subdomain.domain.com to still work so do not redirect the subdomain, i'm using apache 中的通配符 (*) 来处理任何子域,因为这些子域将在 php 中使用 $_SERVER 检测并针对特定任务进行处理。
这就是我到目前为止所拥有的,但是非 www (//domain.com) 最终以无休止的重定向结束
RewriteEngine On
Options -Indexes
RewriteCond %{HTTPS} off [OR]
# add www if not subdomain
RewriteCond %{HTTP_HOST} ^[^.]+\.[^.]+$
RewriteRule ^ https://%{HTTP_HOST}%{REQUEST_URI} [L,R=301]
RewriteCond %{HTTPS} off [OR]
# remove www if subdomain
RewriteCond %{HTTP_HOST} ^www\.([^.]+\.[^.]+\.[^.]+)$ [NC]
RewriteRule ^ https://%1%{REQUEST_URI} [R=301,L]
Apache 虚拟主机两个不同的文件,一个用于非 SSL,另一个用于 SSL,使用让加密
<VirtualHost *:80>
DocumentRoot /var/www/html/www.domain.com
ServerName domain.com
RewriteEngine on
RewriteCond %{SERVER_NAME} =domain.com
RewriteRule ^ https://%{SERVER_NAME}%{REQUEST_URI} [END,NE,R=permanent]
</VirtualHost>
<VirtualHost *:80>
DocumentRoot /var/www/html/www.domain.com
ServerName www.domain.com
ServerAlias *.domain.com
RewriteEngine on
RewriteCond %{SERVER_NAME} =www.domain.com
RewriteRule ^ https://%{SERVER_NAME}%{REQUEST_URI} [END,NE,R=permanent]
</VirtualHost>
<VirtualHost *:443>
ServerName www.domain.com
ServerAlias *.domain.com
DocumentRoot /var/www/html/www.domain.com
RewriteEngine on
RewriteCond %{SERVER_NAME} =domain.com
RewriteRule ^ https://%{SERVER_NAME}%{REQUEST_URI} [END,NE,R=permanent]
Include /etc/letsencrypt/options-ssl-apache.conf
SSLCertificateFile /etc/letsencrypt/live/domain.com/fullchain.pem
SSLCertificateKeyFile /etc/letsencrypt/live/domain.com/privkey.pem
</VirtualHost>
<VirtualHost *:443>
ServerName domain.com
DocumentRoot /var/www/html/www.domain.com
Include /etc/letsencrypt/options-ssl-apache.conf
SSLCertificateFile /etc/letsencrypt/live/domain.com-0001/fullchain.pem
SSLCertificateKeyFile /etc/letsencrypt/live/domain.com-0001/privkey.pem
</VirtualHost>
非常感谢您的所有帮助!
然而,非 www (//domain.com) 最终以无休止的重定向结束
这是由于您的第一个重定向规则应更改为:
Options -Indexes
RewriteEngine On
# add www and https for main domain
RewriteCond %{HTTP_HOST} !^www\. [NC,OR]
RewriteCond %{HTTPS} !on
RewriteCond %{HTTP_HOST} ^(?:www\.)?([^.]+\.[^.]+)$ [NC]
RewriteRule ^ https://www.%1%{REQUEST_URI} [R=301,L,NE]
# remove www if subdomain
RewriteCond %{HTTP_HOST} ^www\. [NC,OR]
RewriteCond %{HTTPS} !on
RewriteCond %{HTTP_HOST} ^(?:www\.)?(?!www\.)([^.]+\.[^.]+\.[^.]+)$ [NC]
RewriteRule ^ https://%1%{REQUEST_URI} [R=301,L]
请务必在清除浏览器后对其进行测试。
您不需要在 www 和其他子域中为 SSL 设置不同的规则。 您需要做的就是制定一个规则来强制执行 HTTPS 和另一个强制执行 www 的规则,以防您在根域上绊倒:
RewriteEngine On
Options -Indexes
# Makes sure HTTPS is used
RewriteCond %{HTTPS} off
RewriteRule ^ https://%{HTTP_HOST}%{REQUEST_URI} [L,R=301]
# Adds www if not subdomain
RewriteCond %{HTTP_HOST} ^example\.com$
RewriteRule ^ http://www.example.com%{REQUEST_URI} [L,R=301]
重要的是在 RewriteCond 上为 www 前置指定根域,或者至少使用不太通用的规则,例如^[a-z0-9-_]+\.[a-z0-9-_]+$
。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.