我正在通过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扩展程序运行的。
编辑上下文并不重要,因为我在页面上放了相同的脚本并且问题仍然存在。
答案 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/"
]
重新加载扩展程序,它应该可以正常工作。