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

我正在尝试将Apache配置为远程服务器的代理,以允许使用CORS的跨域AJAX.为此,我需要Apache响应2个HTTP谓词,如下所示:

>选项:
使用一些简单的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>
最佳答案
以下是我使用Nginx解决它的方法.请注意,我使用的是需要0700的Headers More模块.

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

转载注明原文:Apache / Nginx:代理POST请求到远程服务器,在本地处理OPTIONS请求 - 代码日志