繁体   English   中英

http to https AND //domain.com to www.domain.com AND subdomain.domain.com to subdomain.domain.com through 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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM