【问题标题】:htaccess force ssl/https and non-www while allowing for framework routing to /publichtaccess 强制 ssl/https 和非 www,同时允许框架路由到 /public
【发布时间】: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]结尾
  • @Joe 抱歉,这不起作用。我从 Chrome 获得 ERR_INVALID_REDIRECT 并且它不会将 non-www 重定向到 non-www 无论如何...
  • 考虑到您的原始 Rewrite 工作正常,它这样做很奇怪.. 我们只是在条件中添加了 [OR]
  • 好吧,RewriteRule ^(.*)$ https://%1/$1 [R=301,L] 回溯引用 RewriteCond 正则表达式变量 (%1),在 RewriteCond %{HTTPS} !=on 的情况下不存在该变量。也许这就是为什么?
  • 我最终找到了一个解决方案并将其发布为这个问题的答案

标签: .htaccess ssl mod-rewrite https


【解决方案1】:

经过多次尝试和错误,我设法找到了一种似乎可行的方法!我不知道这是否特定于我的设置,但希望这会帮助其他遇到类似问题的人。

我应用了以下一组规则来将所有请求重定向到非 www 和 https 版本的 url。访问者将始终以https://example.com 结束,无论输入的是 http、https、非 www、www 还是它们的任何组合。

RewriteEngine on
# Redirect all www to https://non-www
RewriteCond %{HTTP_HOST} ^www\.(.*)$ [NC]
RewriteRule ^(.*)$ https://%1/$1 [R=301,L]
# Redirect http to https
RewriteCond %{ENV:HTTPS} !on
RewriteRule ^(.*)$ https://%{HTTP_HOST}/$1 [R=301,L]

拥有http://wwwhttps://non-www 就像在重写规则上添加“s”一样简单,这避免了先访问http://non-www 然后被告知访问https://non-www 的双重反弹。 https://www 也被匹配并被告知反弹到 https://non-www,这样就涵盖了 http/s + www 突变。

似乎对我的设置有效的唯一 https 检查规则是使用 %{ENV:HTTPS},因为 %{HTTPS}%{SERVER_PORT} 80 不起作用,我最终从浏览器。

我的设置(有另一个 htaccess 规则将请求重定向到 public 文件夹)还需要在最后一行规则中使用 https://%{HTTP_HOST}/$1。大多数建议是使用https://%{HTTP_HOST}%{REQUEST_URI},但在我的情况下,%{REQUEST_URI} 包含public 文件夹,它不应该。所以使用$1 而是给它一个已经重写的url,而不是服务器看到的实际请求。

我现在有以下结果:

http://www --> https://non-www (uses www to non-www rules)
http://non-www --> https://non-www (uses http to https rules)
https://www --> https://non-www (uses www to non-www rules)
https://non-www -> https://non-www (does not redirect)

【讨论】:

    猜你喜欢
    • 2011-06-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-09-14
    • 2015-05-10
    • 2016-04-05
    • 2019-01-28
    • 2019-09-08
    相关资源
    最近更新 更多