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强制https,但在一个url上不使用';行不通_.htaccess_Mod Rewrite_Zend Framework - Fatal编程技术网

.htaccess Htaccess强制https,但在一个url上不使用';行不通

.htaccess Htaccess强制https,但在一个url上不使用';行不通,.htaccess,mod-rewrite,zend-framework,.htaccess,Mod Rewrite,Zend Framework,我试图强制我所有的网站使用https。所以我做了: RewriteEngine On RewriteBase / RewriteCond %{REQUEST_FILENAME} !-f RewriteCond %{REQUEST_FILENAME} !-d RewriteRule .* index.php RewriteCond %{HTTP:X-Forwarded-Proto} =http [OR] RewriteCond %{HTTP:X-Forwarded-Proto} ="" Rewr

我试图强制我所有的网站使用https。所以我做了:

RewriteEngine On
RewriteBase /
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule .* index.php

RewriteCond %{HTTP:X-Forwarded-Proto} =http [OR]
RewriteCond %{HTTP:X-Forwarded-Proto} =""
RewriteCond %{HTTPS} !=on
RewriteRule ^ https://%{HTTP_HOST}%{REQUEST_URI} [L,R=302]
它起作用了。问题是,我希望http调用mywebsite.com/api/。。。我也工作。所以我添加了
RewriteCond%{REQUEST\u URI}^/api(/.*)

我的.htaccess是:

RewriteEngine On
RewriteBase /
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule .* index.php

RewriteCond %{HTTP:X-Forwarded-Proto} =http [OR]
RewriteCond %{HTTP:X-Forwarded-Proto} =""
RewriteCond %{HTTPS} !=on
RewriteCond %{REQUEST_URI} !^/api(/.*)?
RewriteRule ^ https://%{HTTP_HOST}%{REQUEST_URI} [L,R=302]
但它不起作用。如果我打电话,它会将我重定向到

我不知道为什么。你有什么想法吗?
我使用Zend 1

----编辑--

已更改对此的.htmy访问权限:

RewriteEngine On

# HTTPS
RewriteCond %{HTTPS} !=on
RewriteCond %{REQUEST_URI} !^/api(/.*)?
RewriteRule ^ https://%{HTTP_HOST}%{REQUEST_URI} [L,R=302]

RewriteBase /
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule .* index.php

Options +Indexes
IndexIgnore *
但还是不行

----编辑2--

新的.htaccess(这一个正在工作):

我不得不用
QUERY\u STRING
添加条件,并将上次重定向更改为
index.php


谢谢@MrWhite

您的指令顺序错误。您的规范HTTP到HTTPS重定向应该在内部重写(即前端控制器)之前进行。否则,对
/api/
的请求将在内部被重写为
/index.php
(因为我假设
/api/
不是一个真正的文件)
/index.php
则与检查
/api/
RewriteCond
指令不匹配。因此,您将被重定向到
https://example.com/index.php
(尽管您在示例中给出了
http

不支持代理

如果您不在代理服务器后面,则应删除检查
X-Forwarded-Proto
HTTP请求头的条件(这些条件仅由代理服务器设置,如果您不在代理服务器后面,则客户端可能恶意设置此头并避免重定向)

这两条线:


更新:如果您在删除上述条件后得到重定向循环,那么您可能毕竟是在SSL代理之后(您应该能够通过检查应用程序看到的HTTP请求头来判断—您不一定需要访问服务器配置—事实上,您可能无法通过查看服务器配置来判断)

(当您位于SSL代理之后,则
HTTPS
始终处于
关闭状态
——您的应用程序向SSL代理提供HTTP响应,然后向客户端提供加密的HTTPS响应。)

请尝试以下操作:

Options +Indexes
IndexIgnore *

RewriteEngine On
RewriteBase /

# HTTP to HTTPS, except for the api subdirectory
RewriteCond %{HTTP:X-Forwarded-Proto} =http [OR]
RewriteCond %{HTTP:X-Forwarded-Proto} =""
RewriteCond %{HTTPS} !=on
RewriteRule !^api https://%{HTTP_HOST}%{REQUEST_URI} [L,R=302]

# Front controller
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule .* index.php [L]

请注意,这不会规范化www与非www。

无论您的代码是什么,请在主目录
.htaccess
文件中仅放置以下代码:

RewriteEngine On
RewriteCond %{HTTPS} !=on
RewriteCond %{THE_REQUEST} !\s/+api/ [NC]
RewriteRule ^ https://%{HTTP_HOST}%{REQUEST_URI} [L,R]

这将强制所有请求(除
api/
外)为
https
,然后如果您请求您的网站/api时使用
http
http
www
或不使用
www
,它将转到
api/
目录,因为它不是
api/
随附或不随
https
以及
www
和上述规则将应用于无
https
,因为此条件
RewriteCond%{https}!=开启
因此,如果附带此选项,它将覆盖此规则,这就是为什么
http://yourwebsite/api
https://yourwebsite/api
可以用了

你是在代理服务器后面吗?@MrWhite nop,不是在代理服务器后面谢谢。我以前试过改变顺序,并将HTTP重定向到HTTPS,但问题仍然存在。请确保你已经清除了红色浏览器缓存。您看到的重定向强烈表明指令是相反的。编辑了my.htaccess to
RewriteCond%{HTTP}=on RewriteCond%{REQUEST_URI}!^/api(/.*)RewriteRule^https://%{HTTP_HOST}%{REQUEST_URI}[L,R=302]
,并更改了顺序,但仍然不起作用(编辑了我的问题)为什么要将
RewriteCond%{HTTPS}!=on
更改为
RewriteCond%{HTTP}=on
?没有名为
HTTP
的服务器变量。它应该是
!=on
(或
off
),因为您正在测试
HTTPS
是否“开”(或“关”)。如果您使用
RewriteCond%{HTTP}=on
则它将永远不会重定向-这就是您在编辑的问题中所说的“不起作用”的意思吗?啊,在这种情况下,听起来您好像是在代理之后?!(例如,Cloudflare flexible SSL碰巧?)然而,OP似乎可能是在SSL代理之后(因此需要检查
HTTP:X-Forwarded-Proto
而不是
HTTPS
)。当OP尝试类似的方法时,他们得到了一个重定向循环(参见另一个答案上的注释)。最后,你是对的,但当你第一次问他时,他说没有
Options +Indexes
IndexIgnore *

RewriteEngine On
RewriteBase /

# HTTP to HTTPS, except for the api subdirectory
RewriteCond %{HTTP:X-Forwarded-Proto} =http [OR]
RewriteCond %{HTTP:X-Forwarded-Proto} =""
RewriteCond %{HTTPS} !=on
RewriteRule !^api https://%{HTTP_HOST}%{REQUEST_URI} [L,R=302]

# Front controller
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule .* index.php [L]
RewriteEngine On
RewriteCond %{HTTPS} !=on
RewriteCond %{THE_REQUEST} !\s/+api/ [NC]
RewriteRule ^ https://%{HTTP_HOST}%{REQUEST_URI} [L,R]