Me he estado golpeando la cabeza tratando de resolver un problema 403 solo con Chrome. Tengo una aplicación ejecutándose en Tomcat8 y la presento con Nginx. La máquina está alojada en un cliente y sospecho que tal vez haya algo en el entorno, pero necesito tener algo con lo que volver a ellos.
Puedo iniciar sesión en la aplicación. Tengo una página de búsqueda que hace que jquery ajax me llame a la API de descanso con la que obtengo el 403.
En Firefox e IE todo funciona bien. Pero en Chrome y Safari obtengo el 403.
Pensé que podría ser algo de CORS ya que estoy haciendo una llamada desde ajax. Deshabilitar la seguridad web en Chrome no hizo nada. Así que no estoy convencido de que sea eso...
Aquí está mi configuración.
Nginx.conf
user www-data;
worker_processes auto;
pid /run/nginx.pid;
events {
worker_connections 768;
# multi_accept on;
}
http {
##
# Basic Settings
##
sendfile on;
tcp_nopush on;
tcp_nodelay on;
keepalive_timeout 65;
types_hash_max_size 2048;
# server_tokens off;
# server_names_hash_bucket_size 64;
# server_name_in_redirect off;
include /etc/nginx/mime.types;
default_type application/octet-stream;
include /etc/nginx/proxy_params;
##
# SSL Settings
##
ssl_protocols TLSv1 TLSv1.1 TLSv1.2; # Dropping SSLv3, ref: POODLE
ssl_prefer_server_ciphers on;
##
# Logging Settings
##
access_log /var/log/nginx/access.log;
error_log /var/log/nginx/error.log;
##
# Gzip Settings
##
gzip on;
gzip_disable "msie6";
# gzip_vary on;
# gzip_proxied any;
# gzip_comp_level 6;
# gzip_buffers 16 8k;
# gzip_http_version 1.1;
# gzip_types text/plain text/css application/json application/javascript text/xml application/xml application/xml+rss text/javascript;
##
# Virtual Host Configs
##
include /etc/nginx/conf.d/*.conf;
include /etc/nginx/sites-enabled/*;
}
mi servidor.conf
server {
server_name myapp.mydomain.com;
root /var/www/tomcat8/webapps/myapp/;
location / {
index index.html index.jsp;
proxy_set_header X-Forwarded-Host $host;
proxy_set_header X-Forwarded-Server $host;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_pass http://127.0.0.1:8080/;
}
}
server {
listen 80;
server_name myapp.mydomain.com;
return 404; # managed by Certbot
}
Aquí está la entrada del registro de nginx para el 403 en mi llamada de servicio
172.16.1.1 - - [19/Jul/2019:16:30:49 -0400] "POST /myap/services/search/lookupUI? HTTP/1.1" 403 0 "https://myapp.mydomain.com/myapp/gui/findpatients.jsp" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/75.0.3770.142 Safari/537.36"
La llamada de servicio en el registro de nginx tiene una opción GET y POST. Puedo pasar un GET en la barra de direcciones del navegador y funcionará.
Estoy tirando de un clavo ardiendo sobre lo que podría ser esto. Esta es una configuración de proxy nginx bastante simple que uso con otros clientes.
Cualquier ayuda sería realmente apreciada.
Respuesta1
TL;DR
Agregue esto al bloque del servidor con la directiva proxy_pass
proxy_set_header Origin "";
Proceso
Tuve exactamente el mismo problema y encontré tu publicación mientras buscaba en Google. Después de dejar de buscar una solución rápida, hice lo siguiente.
Primero verifiqué si las solicitudes llegaron a Tomcat. (Yo uso Docker para Tomcat, por lo que mi interfaz es Docker0. Úselo ifconfig
para ayudar a determinar por qué interfaz pasan sus solicitudes)
Esto mostrará las solicitudes en un formato bastante hostil directamente en la terminal.
sudo tcpdump -i docker0 -nnSX port 8080
Esto creará un archivo "dump.pcap" en su directorio actual que puede copiar a una máquina con Wireshark y verlo con ese
sudo tcpdump -i docker0 -w dump.pcap port 8080
Vi que las solicitudes estaban llegando bien y fue algo que a Tomcat no le gustó que las rechazó incluso antes de que llegaran a mi código Java.
Luego, utilizando herramientas de desarrollo tanto en Firefox como en Chrome (ctrl - shift - i), verifiqué las solicitudes reales. Vaya a la pestaña "red" y busque las solicitudes fallidas. Busque "Solicitar encabezados" y haga clic en "Encabezados sin formato" en Firefox o "Ver código fuente" en Chrome y cópielos en notepad++ o algún otro editor que pueda ordenar líneas. (Editar -> Operaciones de línea -> Ordenar líneas lexicográficamente)
Para comprobar que efectivamente era cierto que la diferencia en los encabezados causaba este problema, utilicé Postman para probar ambos conjuntos de encabezados con la URL fallida. Hay una función de edición masiva en Postman para encabezados donde puede simplemente pegarlos.
Allí era sólo cuestión de eliminación descubrir qué encabezado provocó el error. Primero consideré alterar mi código Javascript para que de alguna manera Chrome no enviara el encabezado Origin, pero pensé que era más fácil y confiable hacer que Nginx eliminara los encabezados. Hice una búsqueda rápida en Google sobre cómo hacerlo y ahí lo tiene.
¡Espero que esto haya sido útil!
Respuesta2
Lo que terminó funcionando para mí fue agregar esta directiva de proxy proxy_set_header Host $http_host;
También limpié algunas cosas que no eran necesarias. Aquí está la configuración resultante.
server {
server_name myapp.mydomain.com;
root /var/www/tomcat8/webapps/myapp/;
location / {
index index.html index.jsp;
proxy_set_header Host $http_host;
proxy_pass http://127.0.0.1:8080/;
}
listen 80;
}