Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/.htaccess/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
.htaccess htaccess强制使用ssl/https和非www,同时允许框架路由到/public_.htaccess_Ssl_Mod Rewrite_Https - Fatal编程技术网

.htaccess htaccess强制使用ssl/https和非www,同时允许框架路由到/public

.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

目前,我在根目录(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]
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
不存在。也许这就是为什么?我最终找到了一个解决方案,并把它作为这个问题的答案发布了出来