我一直在絞盡腦汁試圖找出僅適用於 Chrome 的 403 問題。我有一個在 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
}
這是我的服務呼叫中 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 選項。
我對這可能是什麼感到困惑。這是一個非常簡單的 nginx 代理配置,我與其他客戶端一起使用。
任何幫助將非常感激。
答案1
長話短說
使用 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 上的“查看原始程式碼”,然後將其複製到記事本++或其他可以對行進行排序的編輯器中。 (編輯 -> 行操作 -> 依字典順序對行進行排序)
為了仔細檢查是否確實是標頭差異導致了此問題,我使用 Postman 針對失敗的 URL 測試兩組標頭。 Postman 中有一個標題批量編輯功能,您可以在其中貼上標題。
在那裡,只需進行消除即可找出導致錯誤的標頭。我首先考慮更改我的 Javascript 程式碼,以某種方式導致 Chrome 不發送 Origin 標頭,但我認為讓 Nginx 剝離標頭更容易、更可靠。在谷歌上快速搜尋了一下如何做到這一點,你就知道了。
希望有幫助!
答案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;
}