Chrome でのみ発生する 403 の問題を解明しようと頭を悩ませています。Tomcat8 でアプリケーションを実行しており、Nginx でフロント処理しています。マシンはクライアントでホストされており、環境に何か問題があるのではないかと疑っていますが、クライアントに返すための何かが必要です。
アプリケーションにログインできます。 jQuery Ajax が REST API を呼び出す検索ページがあり、403 が表示されます。
Firefox と IE ではすべて正常に動作します。しかし、Chrome と Safari では 403 が表示されます。
私は ajax から呼び出しているので、これは CORS の問題かもしれないと思いました。Chrome で Web セキュリティを無効にしても何も起こりませんでした。だから、それが原因だとは確信が持てません。
これが私の設定です
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/*;
}
私のserver.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
}
これは私のサービスコールの403のnginxログエントリです
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
要約
proxy_passディレクティブを使用してこれをサーバーブロックに追加します
proxy_set_header Origin "";
プロセス
私もまったく同じ問題を抱えていて、グーグル検索中にあなたの投稿を見つけました。すぐに解決策を見つけるのをあきらめた後、次のことを実行しました。
まず、リクエストが Tomcat に届いたかどうかを確認しました。(Tomcat には docker を使用しているため、インターフェイスは docker0 です。ifconfig
リクエストがどのインターフェイスを通過しているかを判断するのに役立ちます)
これにより、ターミナルにかなりわかりにくい形式でリクエストが表示されます。
sudo tcpdump -i docker0 -nnSX port 8080
これにより、現在のディレクトリに「dump.pcap」ファイルが作成され、Wiresharkを使用してマシンにコピーして確認できます。
sudo tcpdump -i docker0 -w dump.pcap port 8080
リクエストは問題なく届いているのがわかりましたが、Java コードに到達する前にリクエストを拒否するのは Tomcat のせいだとわかりました。
次に、Firefox と Chrome の両方で開発者ツール (Ctrl + Shift + i) を使用して、実際のリクエストを確認しました。[ネットワーク] タブに移動して、失敗したリクエストを見つけます。[リクエスト ヘッダー] を探し、Firefox では [Raw ヘッダー] をクリックし、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;
}