Nginx

Nginx - 根和別名之間的區別?

  • September 29, 2020

我的目標是讓 Laravel 安裝與作為靜態內容生成的 Nuxt 應用程序一起執行。

當位置以 . 開頭時,我希望 Laravel 可用/api。這按預期工作。

對於任何其他請求,我想讓 Nginx 從另一個文件夾中為我提供靜態內容。

root /var/www/html/public/dist;我可以通過在第 18 行 ( )更改文件根目錄並將以下配置更改為下面try_files配置中的狀態來實現這一點。

我試著換掉rootalias這給了我一些時髦的結果。我從 Nginx 收到 500 伺服器響應,錯誤日誌中有以下輸出:

2020/09/29 13:28:17 [error] 7#7: *3 rewrite or internal redirection cycle while internally redirecting to "/index.html", client: 172.21.0.1, server: _, request: "GET /my/fake/url HTTP/1.1", host: "localhost"
172.21.0.1 - - [29/Sep/2020:13:28:17 +0000] "GET /claims/creat HTTP/1.1" 500 580 "-" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/85.0.4183.121 Safari/537.36" "-"

我有以下配置(在 Docker 容器內執行)。

server {
   listen 80 default_server;

   root /var/www/html/public;

   index index.html index.htm index.php;

   server_name _;

   charset utf-8;

   location = /favicon.ico { log_not_found off; access_log off; }
   location = /robots.txt  { log_not_found off; access_log off; }

   error_page 404 /index.php;

   location / {
       alias /var/www/html/public/dist;
       try_files $uri $uri/ /index.html;
       error_page 404 /400.html;
   }

   location ~ /api {
       try_files $uri $uri/ /index.php$is_args$args;
   }

   location ~ \.php$ {
       fastcgi_pass php:9000;
       fastcgi_index index.php;
       fastcgi_param SCRIPT_FILENAME $realpath_root$fastcgi_script_name;
       include fastcgi_params;
   }
   
   location ~ /\.ht {
       deny all;
   }
}

我不完全確定有什麼區別,這也讓我質疑我是否應該使用aliasroot在我的情況下,我希望能在理解這一點方面提供一些幫助。

您的錯誤消息中的問題在於您的try_files,而不是您的rootalias。您嘗試載入一個不存在的 URL 路徑,並且在正常配置中,nginx 只會提供 404 或嘗試載入您的 Web 應用程序的前端控制器。但是你try_files告訴它改為服務/index.html。所以它重新開始嘗試載入/index.html並以相同的方式結束try_files,但該文件也不存在,所以它給出了錯誤rewrite or internal redirection cycle while internally redirecting to "/index.html",因為它已經在嘗試載入/index.html

你應該先修復try_files. 例子:

try_files $uri $uri/ =404;           # static site
try_files $uri $uri/ /index.php;     # PHP front controller

現在,關於你的第二個問題。

root指定實際的文件根目錄,即文件系統上提供靜態文件的目錄,它對應於 URL 路徑/。例如,如果您有root /var/www/html/public並要求一個 URL,/css/myapp.css那麼這將映射到文件路徑/var/www/html/public/css/myapp.css

alias允許您將根目錄下的某些 URL 路徑重新映射到其他目錄,以便您可以從其他地方提供靜態文件。例如,對於 alocation /static/您可以定義alias /var/www/html/files/. 在這種情況下,不會轉到 的子目錄,而是rootalias替換location. 因此,請求/static/將嘗試載入文件而不是./var/www/html/files/``/static/myapp.css``/var/www/html/files/myapp.css``/var/www/html/public/css/myapp.css

alias使用with沒有意義location /。如果需要在此處定義不同的文件路徑,請使用root(但請注意,這可能是一種反模式)。

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