Apache / Nginx: Solicitudes de publicación de proxy a un servidor remoto, las opciones de manejo de las solicitudes localmente
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:
-
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 ).
-
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>
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;
}
}
}