Nginx

nginx 將不帶斜杠的子目錄請求重定向到具有指定埠的 URL

  • July 19, 2020

我有以下問題。

在我的本地測試配置中,當我嘗試訪問https://www.testdomain.local/admin它時,它總是會將我重定向到https://www.testdomain.local:8443/admin/我的系統中無法解決的問題。

我的 nginx 在 Docker 容器中執行,該容器將請求轉發到埠 443 到埠 8443,nginx 正在監聽該埠。

admin 文件夾是根文件夾的子目錄。

root -> /application/public/testdomain
root/admin -> /application/public/testdomain/admin

目前行為如下所示:

https://www.testdomain.local -> https://www.testdomain.local (correct)
https://www.testdomain.local/ -> https://www.testdomain.local (correct)
https://www.testdomain.local/admin/ (with trailing slash) -> https://www.testdomain.local/admin/ (correct)
https://www.testdomain.local/admin (without trailing slash) -> https://www.testdomain.local:8443/admin/ (incorrect)

對於最後一種情況,我的首選行為是:

https://www.testdomain.local/admin -> https://www.testdomain.local:8443/admin or https://www.testdomain.local/admin/

我嘗試了許多通過 Google 或 ServerFault 找到的解決方案,但無法獲得所需的行為。

server {
   listen 8443 ssl;

   server_name www.testdomain.local;
   
   client_max_body_size 108M;

   access_log /var/log/nginx/testdomain.access.log anonymized;

   ssl_certificate /application/common/certificate.crt;
   ssl_certificate_key /application/common/privatekey.key;

   root /application/public/testdomain;
   index index.php;
   
   if (!-e $request_filename) {
       rewrite ^.*$ /index.php last;
   }
   
   location ~ \.php$ {
       fastcgi_pass php:9000;
       fastcgi_index index.php;
       fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
       fastcgi_param PHP_VALUE "error_log=/var/log/nginx/application_php_errors.log";
       fastcgi_buffers 16 16k;
       fastcgi_buffer_size 32k;
       include fastcgi_params;
   }
   
}

nginx 不知道您實際上是在預設埠 443 上為站點提供服務,因為您告訴它在不同的埠上偵聽。因此,當它創建自己的重定向時,它會添加非標準埠號。

您可以使用 關閉此行為port_in_redirect off;。然後,nginx 將在其重定向中省略埠號。

或者,您可以關閉絕對重定向,absolute_redirect off;所有重定向都將相對於 URL 路徑根。在這種情況下,nginx 將重定向到/admin/而不是https://www.testdomain.local:8443/admin/.

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