Nginx

在 nginx 代理中禁用 URL 解碼

  • July 3, 2019

當我瀏覽到這個 URL 時:http://localhost:8080/foo/%5B-%5Dserver ( nc -l 8080) 按原樣接收它:

GET /foo/%5B-%5D HTTP/1.1

但是,當我通過 nginx (1.1.19) 代理此應用程序時:

location /foo {
       proxy_pass    http://localhost:8080/foo;
}

通過 nginx 埠路由的相同請求使用路徑解碼轉發:

GET /foo/[-] HTTP/1.1

GET 路徑中的解碼方括號導致目標伺服器出現錯誤(HTTP 狀態 400 - 路徑中的非法字元…),因為它們未轉義。

有沒有辦法禁用 URL 解碼或將其編碼回來,以便目標伺服器在通過 nginx 路由時獲得完全相同的路徑?一些巧妙的 URL 重寫規則?

引用Valentin V. Bartenev(誰應該得到這個答案的全部功勞):

來自文件的引用:

> > * 如果使用 URI指定 proxy_pass ,則在將請求傳遞給伺服器時,與位置匹配的規範化請求 URI 的一部分將替換為指令中指定的 URI > * 如果proxy_pass未指定URI,則請求 URI 以與客戶端在處理原始請求時發送的相同格式傳遞給伺服器 > > >

在您的情況下,正確的配置是:

location /foo {
   proxy_pass http://localhost:8080;
}

引用自:https://serverfault.com/questions/459369