.htaccess htaccess强制使用ssl/https和非www,同时允许框架路由到/public
目前,我在根目录(public_html)中有一个htaccess,它具有以下规则:.htaccess htaccess强制使用ssl/https和非www,同时允许框架路由到/public,.htaccess,ssl,mod-rewrite,https,.htaccess,Ssl,Mod Rewrite,Https,目前,我在根目录(public_html)中有一个htaccess,它具有以下规则: RewriteEngine on RewriteRule ^(.*) public/$1 [L] public\u html/public文件夹保存资产,而public\u html/application文件夹保存MVC项目。我目前正在使用这些规则强制在public\u html/public文件夹中使用非www RewriteCond %{HTTP_HOST} ^www\.(.*)$ [NC] Rewri
RewriteEngine on
RewriteRule ^(.*) public/$1 [L]
public\u html/public
文件夹保存资产,而public\u html/application
文件夹保存MVC项目。我目前正在使用这些规则强制在public\u html/public
文件夹中使用非www
RewriteCond %{HTTP_HOST} ^www\.(.*)$ [NC]
RewriteRule ^(.*)$ http://%1/$1 [R=301,L]
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 --> 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 ^(.*)$ http://%1/$1 [R=301,L]
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中,而不应该是URL,只是默默地创建一个到它的vhost路由
我已经尝试了这些规则的各种配置,在public\u html
文件夹中,在public
文件夹中,不同的规则顺序等等,但是没有任何东西给我想要的效果
有人能帮我弄清楚如何让这些规则很好地协同工作吗?谢谢 经过多次尝试和错误,我终于找到了一种似乎有效的方法!我不知道这是否是特定于我的设置,但希望这将有助于其他人有类似的问题 我应用了以下一组规则将所有请求重定向到url的非www和https版本。无论是否键入了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]
只需在重写规则上添加“s”即可,这样就避免了先去然后被告知去访问的双重反弹。也被匹配并告知跳转到,因此涵盖了http/s+www突变
唯一对我的设置有效的https检查规则是使用%{ENV:https}
,因为%{https}
和%{SERVER\u PORT}80
不起作用,我最终在浏览器中出现了“无效重定向”或“太多重定向”错误
我的设置(使用另一个htaccess规则将请求重定向到public
文件夹)还需要在最后一行规则中使用https://%{HTTP_HOST}/$1
。大多数建议使用https://%{HTTP\u HOST}%{REQUEST\u URI}
,但在我的例子中,%{REQUEST\u URI}
包含公共
文件夹,它不应该包含该文件夹。因此,使用$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)
您是否尝试将这些规则与原始的强制非www规则相结合?所以:
RewriteCond%{HTTP_HOST}^www\(.*)$[NC,或]
然后在下面RewriteCond%{HTTPS}=在
上。因此,只有一个重写需要两个条件。以RewriteRule^(.*)$https://%1/$1[R=301,L]
@Joe抱歉,这样不行。我从Chrome中得到错误无效重定向,但它没有重定向到任何地方…奇怪的是,考虑到你原来的重写工作正常。。我们只是在条件中添加了一个[OR]
。好的重写规则^(.*)$https://%1/$1[R=301,L]
返回对RewriteCond regex变量(%1)的引用,该变量在RewriteCond%{https}的情况下=on
不存在。也许这就是为什么?我最终找到了一个解决方案,并把它作为这个问题的答案发布了出来