Apache / Nginx: POST-запросы прокси к удаленному серверу, локально обрабатывают OPTIONS-запросы - PullRequest
3 голосов
/ 14 февраля 2011

Я пытаюсь настроить Apache для работы в качестве прокси для удаленного сервера, чтобы разрешить междоменный AJAX с использованием CORS . Для этого мне нужно, чтобы Apache ответил на 2 HTTP-глагола, например:

  1. ВАРИАНТЫ: Ответьте на этот предварительный запрос CORS с помощью нескольких простых заголовков HTTP. Я имел в виду, что это может быть простой CGI-скрипт ( options.pl ).

  2. 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>

Ответы [ 2 ]

4 голосов
/ 11 ноября 2011

Теперь вы можете использовать мой модуль 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;
        }
    }
} 
4 голосов
/ 15 февраля 2011

Вот как я решил это с помощью Nginx.Обратите внимание, что я использую модуль Headers More , который потребовал от меня компиляции Nginx из источника .

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;
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...