如何解决通过htaccess从http到https AND //domain.com到www.domain.com和subdomain.domain.com到subdomain.domain.com
我希望有人能为我提供帮助,因为多年来我一直尝试使用不同的重定向方法,并在我正在从事的项目中遇到了有趣的方法。
我需要HTTP重定向到HTTPS 和 我需要非www重定向到www,但仅当//domain.com没有任何子域时 和 我需要subdomain.domain.com仍能正常工作,所以请不要重定向该子域,我在apache中使用通配符(*)处理任何子域,因为这些将在$ _SERVER的php中检测到并针对特定任务进行处理。
到目前为止,这是我所拥有的,但是非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,另一个用于使用let加密的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,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,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-_]+$
。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。