Я ломал голову, пытаясь решить проблему 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;
}