【问题标题】:How to differentiate request coming from command-line and browsers?如何区分来自命令行和浏览器的请求?
【发布时间】:2014-07-30 17:02:30
【问题描述】:

要检查它是cli还是http请求,在PHP中可以使用php_sapi_name这个方法,take a look here。我正在尝试在 apache conf 文件中复制它。基本思想是,如果请求来自 cli,则提供“最少信息”,如果请求来自浏览器,则用户将被重定向到不同的位置。这可能吗?

我的伪代码:

IF (REQUEST_COMING_FROM_CLI) {
  ProxyPass          /      http://${IP_ADDR}:5000/
  ProxyPassReverse   /      http://${IP_ADDR}:5000/
}ELSE IF(REQUEST_COMING_FROM_WEB_BROWSERS){
  ProxyPass          /      http://${IP_ADDR}:8585/welcome/
  ProxyPassReverse   /      http://${IP_ADDR}:8585/welcome/
}

补充cURL 使用不同协议的主机,包括 http、ftp 和 telnet。 apache 可以确定请求是来自 cli 还是浏览器?

【问题讨论】:

  • php_sapi_name 并没有像你想象的那样做。它只是区分 PHP 如何与网络服务器通信,无论是直接(命令行 php 解释器)还是通过 mod-php 之类的东西。

标签: http curl apache2


【解决方案1】:

据我所知,使用 apache 无法找到差异。

如果来自命令行的请求设置正确,apache 无法区分命令行和浏览器。

当你在 PHP 中检查它时(使用 php_sapi_name,正如你所建议的),它只检查 php 本身是从哪里调用的(cli、apache 等),而不是 http 请求来自哪里。

使用 telnet 作为命令行,您可以连接到 apache,设置所需的 http-headers 并像使用浏览器一样发送请求(仅,浏览器为您设置 headers)

所以,我不认为 apache 可以区分控制台或浏览器

【讨论】:

  • 是的,我认为 OP 没有看到一切都只是在谈论 HTTP 协议,可能是图形浏览器、cli 浏览器、telnet,任何东西......相同的协议,没有区别。
【解决方案2】:

这样做的唯一方法是测试在请求标头中发送的用户代理,但此信息可以轻松更改。

默认情况下,每个 php http 请求对 apache 服务器都是这样的:

192.168.1.15 - - [01/Oct/2008:21:52:43 +1300] "GET / HTTP/1.0" 200 5194 "-" "-"

此信息可以轻松更改为看起来像浏览器,例如使用此

ini_set('user_agent', 'Mozilla/5.0 (Windows; U; Windows NT 6.0; en-GB; rv:1.9.0.3) Gecko/2008092417 Firefox/3.0.3');

http 请求将如下所示

192.168.1.15 - - [01/Oct/2008:21:54:29 +1300] "GET / HTTP/1.0" 200 5193 "-" "Mozilla/5.0 (Windows; U; Windows NT 6.0; en-GB; rv:1.9.0.3) Gecko/2008092417 Firefox/3.0.3"

此时 apache 会认为接收到的连接来自 windows firefox 3.0.3。

所以没有确切的方法来获取这些信息。

【讨论】:

    【解决方案3】:

    如果 cli 请求未在 User-Agent 标头中欺骗真实浏览器,则可以使用 BrowserMatch 指令。否则,就像其他人所说的那样,没有办法区分。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-04-14
      • 2017-05-07
      • 2010-09-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-01-30
      相关资源
      最近更新 更多