Apache / Nginx: Solicitudes de publicación de proxy a un servidor remoto, las opciones de manejo de las solicitudes localmente

StackOverflow https://stackoverflow.com/questions/4994803

  •  14-11-2019
  •  | 
  •  

Pregunta

Estoy tratando de configurar Apache para actuar como un proxy a un servidor remoto, para permitir el AJAX de dominio cruzado usando cors . Para lograr esto, necesito apache para responder a 2 verbos HTTP, como SO:

  1. Opciones: Responda a la solicitud de este vuelo pre-vuelo de CORS con algunos encabezados HTTP simples. Tenía en cuenta que esto podría ser un script de CGI simple ( options.pl ).

  2. POST: Proxy Todas las solicitudes posteriores al servidor remoto, pero agregue el encabezado "*" de "*" de control de acceso que permita que suceda la solicitud de dominio cruzado.

    Puedo lograr estos dos requisitos de forma independiente, pero no puedo configurar Apache para hacer ambas cosas. El problema es que cuando se configura el ProxyPass y ProxyPassreverse, las solicitudes de opciones ya no llegan al script de CGI, están proxiadas en el servidor remoto.

    Mi configuración actual está a continuación. Me gustaría resolver esto con una solución de servidor web puro, por ejemplo. Apache / Nginx (en lugar de ejecutar algún código de aplicación), si es posible.

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

¿Fue útil?

Solución

Así es como lo he resuelto usando NGINX.Tenga en cuenta que estoy usando la encabezados más módulo que me requería compila nginx de la fuente .

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

Otros consejos

Puede usar mi nginx_cross_origin_module ahora.Admite la función CORS completa: https://github.com/yaoweibin/nginx_cross_origin_module

Ejemplo:

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

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top