首页 > 解决方案 > http 到 https 和 //domain.com 到 www.domain.com 和 subdomain.domain.com 通过 htaccess 到 subdomain.domain.com

问题描述

我希望有人可以帮助我,因为多年来我一直在尝试不同的重定向方法,并且在我正在进行的项目中遇到了一个有趣的方法。

我需要 HTTP 重定向到 HTTPS 并且我需要非 www 重定向到 www 但前提是 //domain.com 没有任何子域并且我需要 subdomain.domain.com 仍然可以工作所以不要重定向子域,我正在使用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,使用 let encrypt

<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>

非常感谢您的所有帮助!

标签: phpregexapache.htaccessmod-rewrite

解决方案


然而,非 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]

请务必在清除浏览器后对其进行测试。


推荐阅读