.htaccess Htaccess强制https,但在一个url上不使用';行不通
我试图强制我所有的网站使用https。所以我做了:.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
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 toRewriteCond%{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]