Nginx - 根和別名之間的區別?
我的目標是讓 Laravel 安裝與作為靜態內容生成的 Nuxt 應用程序一起執行。
當位置以 . 開頭時,我希望 Laravel 可用
/api
。這按預期工作。對於任何其他請求,我想讓 Nginx 從另一個文件夾中為我提供靜態內容。
root /var/www/html/public/dist;
我可以通過在第 18 行 ( )更改文件根目錄並將以下配置更改為下面try_files
配置中的狀態來實現這一點。我試著換掉
root
,alias
這給了我一些時髦的結果。我從 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; } }
我不完全確定有什麼區別,這也讓我質疑我是否應該使用
alias
或root
在我的情況下,我希望能在理解這一點方面提供一些幫助。
您的錯誤消息中的問題在於您的
try_files
,而不是您的root
或alias
。您嘗試載入一個不存在的 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/
. 在這種情況下,不會轉到 的子目錄,而是root
將alias
替換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
(但請注意,這可能是一種反模式)。