TL;DR

TL;DR

Я ломал голову, пытаясь решить проблему 403 только с Chrome. У меня есть приложение, работающее в tomcat8, и я открываю его с помощью Nginx. Машина размещена на клиенте, и я подозреваю, что, возможно, в среде что-то есть, но мне нужно что-то, с чем можно было бы им ответить.

Я могу войти в приложение. У меня есть страница поиска, которая заставляет jquery ajax вызывать мой rest api, с которым я получаю 403..

В Firefox и IE все работает хорошо. Но в Chrome и Safari я получаю 403.

Я думал, что это может быть связано с CORS, так как я делаю вызов из ajax. Отключение веб-безопасности в Chrome ничего не дало. Так что я не уверен, что это так..

Вот мой конфиг

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

мой сервер.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


}

Вот запись журнала nginx для ошибки 403 при моем вызове службы

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"

Вызов службы в журнале nginx имеет как GET, так и POST-опцию. Я могу передать GET в адресную строку браузера, и это сработает.

Я тяну соломинку, чтобы понять, что это может быть. Это довольно простая конфигурация прокси-сервера nginx, которую я использую с другими клиентами..

Любая помощь могла бы быть полезна.

решение1

TL;DR

Добавьте это в блок сервера с директивой proxy_pass

proxy_set_header Origin "";

Процесс

У меня была точно такая же проблема, и я нашел ваш пост, когда гуглил. После того, как я отказался от поиска быстрого решения, я сделал следующее.

Сначала я проверил, дошли ли запросы до tomcat. (Я использую docker для tomcat, поэтому мой интерфейс — docker0. Используйте ifconfigдля выяснения того, через какой интерфейс проходят ваши запросы)

Это покажет запросы в довольно неудобном формате прямо в терминале.

sudo tcpdump -i docker0 -nnSX port 8080

Это создаст файл "dump.pcap" в вашем текущем каталоге, который вы можете скопировать на машину с Wireshark и просмотреть его там.

sudo tcpdump -i docker0 -w dump.pcap port 8080

Я видел, что запросы проходят нормально, но это не понравилось Tomcat, и он отклонил их еще до того, как они достигли моего кода Java.

Затем, используя инструменты разработчика в Firefox и Chrome (ctrl - shift - i), я проверил фактические запросы. Перейдите на вкладку «Сеть» и найдите невыполненные запросы. Найдите «Заголовки запросов» и нажмите «Необработанные заголовки» в Firefox или «Просмотр исходного кода» в Chrome и скопируйте их в Notepad++ или какой-нибудь другой редактор, который может сортировать строки. (Правка -> Операции со строками -> Сортировать строки лексикографически)

Чтобы еще раз убедиться, что проблема действительно была вызвана разницей в заголовках, я использовал Postman для проверки обоих наборов заголовков по отношению к неисправному URL. В Postman есть функция массового редактирования заголовков, с помощью которой можно просто вставить заголовки.

Там это был просто вопрос исключения, чтобы выяснить, какой заголовок вызвал ошибку. Сначала я думал изменить свой код Javascript, чтобы как-то заставить Chrome не отправлять заголовок Origin, но решил, что будет проще и надежнее заставить Nginx обрезать заголовки. Быстро поискал в Google, как это сделать, и вот вам.

Надеюсь, это было полезно!

решение2

В конечном итоге мне помогло добавление следующей директивы прокси proxy_set_header Host $http_host;

Я также убрал кое-что ненужное. Вот полученная конфигурация.

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;

}

Связанный контент