【发布时间】:2019-01-06 21:16:23
【问题描述】:
目前我在根目录 (public_html) 中有一个 htaccess,它具有以下规则:
RewriteEngine on
RewriteRule ^(.*) public/$1 [L]
pubic_html/public 文件夹保存资产,而public_html/application 文件夹保存 MVC 项目。我目前正在使用这些规则来强制 public_html/public 文件夹中的非 www
RewriteCond %{HTTP_HOST} ^www\.(.*)$ [NC]
RewriteRule ^(.*)$ http://%1/$1 [R=301,L]
当前设置有这个效果
http://www --> http://non-www
http://non-www --> http://non-www
https://www --> http://non-www
https://non-www -> https://non-www
在强制执行非 www 方面这是理想的效果,但我也想强制执行 ssl/https。在public文件夹中实现以下规则时
RewriteCond %{HTTP_HOST} ^www\.(.*)$ [NC]
RewriteRule ^(.*)$ https://%1/$1 [R=301,L]
RewriteCond %{HTTPS} !=on
RewriteRule (.*) https://%{HTTP_HOST}%{REQUEST_URI} [L,R=301]
我最终得到以下结果
http://www --> https://non-www/public/
http://non-www --> https://non-www/public/
https://www --> https://non-www/public/
https://non-www -> https://non-www/public/
因此,非 www 和 ssl/https 正在强制执行,但现在都将 public 文件夹放入 URL 中,它不应该这样做,只是默默地创建一个虚拟主机路由到它。
我已经尝试了这些规则的各种配置,在 public_html 文件夹、public 文件夹内、不同的规则顺序等,但没有什么能达到我想要的效果。
有人可以帮我弄清楚如何让所有这些规则很好地协同工作吗?谢谢!
【问题讨论】:
-
您是否尝试过将这些规则与您原来的强制非 www 规则相结合?所以:
RewriteCond %{HTTP_HOST} ^www\.(.*)$ [NC,OR],然后是RewriteCond %{HTTPS} !=on。所以只有一个 Rewrite 是两个条件。以RewriteRule ^(.*)$ https://%1/$1 [R=301,L]结尾 -
考虑到您的原始 Rewrite 工作正常,它这样做很奇怪.. 我们只是在条件中添加了
[OR]。 -
好吧,
RewriteRule ^(.*)$ https://%1/$1 [R=301,L]回溯引用 RewriteCond 正则表达式变量 (%1),在RewriteCond %{HTTPS} !=on的情况下不存在该变量。也许这就是为什么? -
我最终找到了一个解决方案并将其发布为这个问题的答案
标签: .htaccess ssl mod-rewrite https