我想在调用服务器API时在标头中使用X-Requested-With
。服务器有一个. htaccess
行,用于查找X-Requested-With
字段中的特定值,即:X-Requested-with: com.myApp
-如果找不到,拒绝连接。是的,我知道X-Requested-With
可以被欺骗,不是一个安全的方法可以依赖,但它是我的应用程序/服务器安全的第一道防线。
下面的htaccess条件适用于Android设备,但对于iOS设备,连接被拒绝。在iOS中,我可以看到X-Requested-With被传递,并且值正确,那么为什么服务器只在iOS中拒绝连接?如何在iOS中解决这个问题?
.htaccess权限:
RewriteCond %{HTTP:X-Requested-With} !^com.myapp$ [NC]
RewriteRule ^ - [F]
我尝试了多种条件,但都失败了:
RewriteCond %{HTTP:X-Requested-With} !^com.myapp [NC]
RewriteCond %{HTTP:X-Requested-With} !com.myapp [NC]
RewriteCond %{HTTP:X-Requested-With} !com\.myapp [NC]
RewriteCond %{HTTP:X-Requested-With} !myapp [NC]
我的服务器连接都是HTTPS,但上面的规则在Android上是有效的(只使用HTTP)。如果我把它改为HTTPS
,它也会断开Android的连接。我觉得很奇怪,因为所有的连接都是HTTPS。为什么会这样呢?
在iOS请求标题(所有版本)中,我还看到:Origin: ionic//myapp
,但在Android上它只是Origin: http://localhost
,我怎么才能让Android也显示Origin: ionic//myapp
或类似的?如果我可以让Android显示与iOS相同,那么也许我的htaccess可以寻找起源,而不是X-请求-与?
最后,是否有可能编写一个条件HTAccess规则;一个用于Android,使用X-Requested-With
,另一个用于iOS,使用Origin
,我该怎么做?
RewriteCond %{HTTP:X-Requested-With} !^com.myapp$ OR %{HTTP:Origin} !^ionic//myapp$ [NC]
RewriteCond ^ - [F]
1条答案
按热度按时间afdcj2ne1#
在iOS中,我可以看到X-Requested-With被传递,值正确,那么为什么服务器只在iOS中拒绝连接?
失败(请求被阻塞)的唯一原因是您的 * 服务器接收到的 * 请求没有包含预期的头。
因此,这似乎意味着从iOS设备收到的请求不包含预期的报头。也许应用程序正在发送报头,但中间代理在它到达服务器之前删除/修改了它?
您应该能够确定您的应用程序实际上在HTTP请求上接收到了什么标头。
我的服务器连接都是HTTPS,但是上面的规则在Android上是有效的(只使用HTTP)。如果我把它改为
HTTPS
,它也会断开Android的连接。我觉得很奇怪,因为所有的连接都是HTTPS。为什么会这样呢?%{HTTP:<header>}
语法引用HTTP请求头的名称。这与请求是通过HTTP还是HTTPS无关。HTTPS只是SSL/TLS上的HTTP。它仍然是一个"HTTP头"。没有%{HTTPS:<header>}
这样的东西-如果这不会导致错误,那么它将只返回一个空字符串,您的求反条件将成功(从而阻止请求)。在iOS请求标题(所有版本)中,我还看到:
Origin: ionic//myapp
,但在Android上它只是Origin: http://localhost
,我怎么才能让Android也显示Origin: ionic//myapp
或类似的?如果我可以让Android显示与iOS相同,那么也许我的htaccess可以寻找起源,而不是X-请求-与?您无法控制
Origin
标头的设置,这由用户代理(浏览器、应用引擎等)决定。但是你大概也可以检查(不是)这两种情况,例如:
或者,分成两个 * 条件 *:
第二个示例使用
=
前缀运算符使其成为精确字符串匹配(字典比较),而不是正则表达式。可以在
RewriteCond
指令上使用OR
标志。但是,在处理取反的条件时,逻辑应该是 * AND *,而不是 * OR *。如果对两个取反的条件执行逻辑OR,则条件将始终成功,请求将始终被阻止。例如,它应该是这样的:
这两个条件是隐式AND的。