我希望有人能帮我,因为多年来,我一直在尝试不同的重定向方法,并在我正在从事的项目中遇到了一个有趣的方法。
我需要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,另一个用于SSL,使用let加密。
<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>非常感谢您的帮助!
发布于 2020-08-18 06:30:21
然而,
的非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]请确保在清除浏览器后对其进行测试。
发布于 2020-08-17 21:23:21
您不需要在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]重要的是要为www预置指定RewriteCond上的根域,或者至少使用一个不太通用的规则,例如^[a-z0-9-_]+\.[a-z0-9-_]+$。
https://stackoverflow.com/questions/63458505
复制相似问题