Apache / Nginx:代理POST请求到远程服务器,在本地处理OPTIONS请求

时间:2011-02-14 16:51:43

标签: apache proxy nginx cors

我正在尝试将Apache配置为充当远程服务器的代理,以允许使用CORS的跨域AJAX。为实现这一目标,我需要Apache响应2个HTTP动词,如下所示:

  1. OPTIONS: 使用一些简单的HTTP标头响应此CORS“飞行前”请求。我记得这可能是一个简单的CGI脚本(options.pl)。

  2. POST: 将所有POST请求代理到远程服务器,但添加Access-Control-Allow-Origin“*”标头以允许跨域请求发生。

  3. 我可以独立地实现这两个要求,但是我不能将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>
    

2 个答案:

答案 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;
        }
    }
}