如何区分来自命令行和浏览器的请求?

时间:2014-07-30 17:02:30

标签: http curl apache2

要检查它是cli还是http请求,在PHP中可以使用此方法php_sapi_name take a look here。我试图在apache conf文件中复制它。根本的想法是,如果请求来自cli a'最小信息'如果请求来自浏览器,那么用户将被重定向到不同的位置。这可能吗?

MY PSEUDO CODE:

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&远程登录。如果请求来自cli或浏览器,apache可以搞清楚吗?

4 个答案:

答案 0 :(得分:2)

据我所知,没有办法使用apache找到差异。

如果来自命令行的请求设置正确,则apache无法在命令行和浏览器之间产生影响。

当您在PHP中检查它时(使用php_sapi_name,如您所建议的那样),它只检查调用php本身的位置(cli,apache等),而不是http请求的来源。

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

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

答案 1 :(得分: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&#39 ;,   ' 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。

因此没有确切的方法来获取此信息。

答案 2 :(得分:1)

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

答案 3 :(得分:0)

如果您只想区分命令行和浏览器调用,则非常容易。通常,在命令行中调用可执行文件时,会将两个变量传递给可执行文件" argv"和" argc"。 argv是传递的参数的索引数组,argc是传递的参数数。

在PHP中它是一样的。这是我的例子:

if(is_array($argv)){    
    print ("This php script has been called using command-line.");
    print("\nThe number of arguments ". $argc);
    print("\nAnd here are all passed arguments\n");
    print_r($argv);
}
else {
    print ("This php script has been called using a browser");
}

以下是带有两个参数的命令行调用后的输出:

And here is the output after a command-line call with two parameters: