我正在尝试将Apache配置为充当远程服务器的代理,以允许使用CORS的跨域AJAX。为实现这一目标,我需要Apache响应2个HTTP动词,如下所示:
OPTIONS: 使用一些简单的HTTP标头响应此CORS“飞行前”请求。我记得这可能是一个简单的CGI脚本(options.pl)。
POST: 将所有POST请求代理到远程服务器,但添加Access-Control-Allow-Origin“*”标头以允许跨域请求发生。
我可以独立地实现这两个要求,但是我不能将Apache配置为同时执行这两个要求。问题是当配置ProxyPass和ProxyPassReverse时,OPTIONS请求不再命中CGI脚本,它们被代理到远程服务器。
我目前的配置如下。我想用纯网络服务器解决方案解决这个问题,例如:如果可能的话,Apache / Nginx(而不是运行一些应用程序代码)。
<VirtualHost *:80>
ScriptAlias /cgi-bin/ /usr/lib/cgi-bin/
DocumentRoot /var/www
<Location "/">
# Disallow all verbs except OPTIONS and POST
order deny,allow
deny from all
# OPTIONS should be handled by a local CGI script
<Limit OPTIONS>
allow from all
Script OPTIONS /cgi-bin/options.pl
</Limit>
# POST requests are proxied to a remote server
<Limit POST>
allow from all
ProxyPass http://somewhere-else/
ProxyPassReverse http://somewhere-else/
Header add Access-Control-Allow-Origin "*"
</Limit>
</Location>
</VirtualHost>
答案 0 :(得分:4)
以下是我使用Nginx解决它的方法。请注意,我使用Headers More模块,要求我compile Nginx from source。
location / {
if ($request_method = 'OPTIONS') {
more_set_headers 'Access-Control-Allow-Origin: *';
more_set_headers 'Access-Control-Allow-Methods: POST, OPTIONS';
more_set_headers 'Access-Control-Max-Age: 1728000';
more_set_headers 'Content-Type: text/plain; charset=UTF-8';
return 200;
}
if ($request_method = 'POST') {
more_set_headers 'Access-Control-Allow-Origin: *';
proxy_pass http://somewhere-else;
}
}
答案 1 :(得分:4)
您现在可以使用我的nginx_cross_origin_module。它支持完整的CORS功能:https://github.com/yaoweibin/nginx_cross_origin_module
示例:
http {
cors on;
cors_max_age 3600;
cors_origin_list unbounded;
cors_method_list GET HEAD PUT POST;
cors_header_list unbounded;
server {
listen 80;
server_name localhost;
location / {
root html;
index index.html index.htm;
}
}
}