長話短說

長話短說

我一直在絞盡腦汁試圖找出僅適用於 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;

}

相關內容