php - 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>
非常感谢您的所有帮助!
解决方案
然而,非 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]
请务必在清除浏览器后对其进行测试。
推荐阅读
- node.js - 如何在 web.config 的处理程序标记中指定文件路径
- python - AttributeError:“NoneType”对象没有属性“组”{for instagram}
- php - 即使我有 createview(),Symfony 4 错误呈现表单?
- javascript - Vue 内联返回方法
- c++ - Arduino上数学运算的计时速度 - 异常
- python-3.x - 如何使用 setuptools 在 Python 3.6 中的库分发中包含父文件夹结构?
- date - Hive Case 语句参数类型不匹配
- c# - 当属性的命名空间为空时,如何在序列化时设置命名空间?
- python-3.x - 有没有一种简单的方法可以在 PDF 中查找特定文本、突出显示并打印或保存到新文件?
- c# - C#问题从服务器发送消息到多个客户端(套接字编程)