要检查它是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可以搞清楚吗?
答案 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");
}
以下是带有两个参数的命令行调用后的输出: