HTTP_ORIGIN标头不是通过jquery ajax发送的

时间:2014-08-24 16:39:54

标签: javascript php jquery ajax google-chrome-extension

我正在通过jquery学习和摆弄跨域请求。我制作了一个PHP脚本,可以打印它收到的所有标题

foreach ($_SERVER as $header=>$value){
        echo "$header:$value \n";
    }

然后我通过jQuery发出了一个ajax请求

$.ajax({
    url:'http://cin.ufpe.br/~rvcam/test',
    success:addData,
    crossDomain:true,
    contentType:'text/plain',
    error:function(xhr, status, error){alert(status+error);}
});

(请注意,我将crossDomain设置为true以确保请求将被视为CORS)

但是php文件的返回是

UNIQUE_ID:U-oSxqwVAAMAAAqLS80AAAAa 
HTTP_HOST:cin.ufpe.br 
HTTP_CONNECTION:keep-alive 
HTTP_CACHE_CONTROL:no-cache 
HTTP_PRAGMA:no-cache 
HTTP_ACCEPT:*/* 
HTTP_USER_AGENT:Mozilla/5.0 (Windows NT 6.3; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/36.0.1985.143 Safari/537.36 
CONTENT_TYPE:text/plain 
HTTP_REFERER:http://dresdencodak.com/2007/05/22/for-lack-of-a-better-term/ 
HTTP_ACCEPT_ENCODING:gzip,deflate,sdch 
HTTP_ACCEPT_LANGUAGE:en-US,en;q=0.8,pt;q=0.6 
HTTP_COOKIE:__utma=126956233.172626394.1408376074.1408376074.1408376074.1; __utmc=126956233; __utmz=126956233.1408376074.1.1.utmcsr=(direct)|utmccn=(direct)|utmcmd=        (none); _ga=GA1.2.172626394.1408376074 
PATH:/usr/local/bin:/usr/bin:/bin 
SERVER_SIGNATURE: 
SERVER_SOFTWARE:Apache/2.2.16 (Debian) 
SERVER_NAME:cin.ufpe.br 
SERVER_ADDR:172.21.0.3 
SERVER_PORT:80 
REMOTE_ADDR:172.23.16.229 
DOCUMENT_ROOT:/etc/apache2/htdocs 
SERVER_ADMIN:webmaster@localhost 
SCRIPT_FILENAME:/home/rvcam/public_html/test/index.php 
REMOTE_PORT:59739 
GATEWAY_INTERFACE:CGI/1.1 
SERVER_PROTOCOL:HTTP/1.1 
REQUEST_METHOD:GET 
QUERY_STRING: 
REQUEST_URI:/~rvcam/test/ 
SCRIPT_NAME:/~rvcam/test/index.php 
PHP_SELF:/~rvcam/test/index.php 
REQUEST_TIME:1408897734 

如你所见,没有"起源"头。此外,我不知道这是否相关,但脚本是从Chrome扩展程序运行的。

编辑上下文并不重要,因为我在页面上放了相同的脚本并且问题仍然存在。

2 个答案:

答案 0 :(得分:3)

Origin标头仅针对需要CORS的跨源请求发送。当您在清单文件中声明主机权限时,如"permissions": ["http://example.com/*"]中所述,那么您的扩展程序中对example.com的任何请求都将使用CORS。

如果您想识别Chrome扩展程序中的请求,只需添加自定义标题:

$.ajax({
    url: 'http://example.com',
    crossDomain: false,
    headers: {
        'X-My-Header': 'my header'
    }
});

或者在香草JS中:

var x = new XMLHttpRequest();
x.open('GET', 'http://example.com');
x.setRequestHeader('X-My-Header', 'my header');
x.send();

不要忘记检查请求是否没有Origin请求标头。通过检查Origin标头不存在,您确定该请求是由同一来源的页面或您的扩展程序发出的。

答案 1 :(得分:0)

问题恰恰在于脚本是从Chrome扩展程序执行的。必须允许用户使用XHR请求。

您必须在manifest.json中添加“权限”适当性,就像这样

"permissions": [
  "http://www.example.com/",
  "https://www.example.com/"
]

重新加载扩展程序,它应该可以正常工作。

See more about XHR on Chrome Extensions