以 Laravel 5.8 文件 為準,淺析 Nginx 配置。可作為 輕鬆部署 Laravel 應用 的擴充閱讀。
方便起見,我在註釋中使用 []
包裹引用配置中的值。
server {
# 監聽 HTTP 協議預設的 [80] 埠。
listen 80;
# 繫結主機名 [example.com]。
server_name example.com;
# 伺服器站點根目錄 [/example.com/public]。
root /example.com/public;
# 新增幾條有關安全的響應頭;與 Google+ 的配置類似,詳情參見文末。
add_header X-Frame-Options "SAMEORIGIN";
add_header X-XSS-Protection "1; mode=block";
add_header X-Content-Type-Options "nosniff";
# 站點預設頁面;可指定多個,將順序查詢。
# 例如,訪問 http://example.com/ Nginx 將首先嚐試「站點根目錄/index.html」是否存在,不存在則繼續嘗試「站點根目錄/index.htm」,以此類推...
index index.html index.htm index.php;
# 指定字符集為 UTF-8
charset utf-8;
# Laravel 預設重寫規則;刪除將導致 Laravel 路由失效且 Nginx 響應 404。
location / {
try_files $uri $uri/ /index.php?$query_string;
}
# 關閉 [/favicon.ico] 和 [/robots.txt] 的訪問日誌。
# 並且即使它們不存在,也不寫入錯誤日誌。
location = /favicon.ico { access_log off; log_not_found off; }
location = /robots.txt { access_log off; log_not_found off; }
# 將 [404] 錯誤交給 [/index.php] 處理,表示由 Laravel 渲染美觀的錯誤頁面。
error_page 404 /index.php;
# URI 符合正規表示式 [\.php$] 的請求將進入此段配置
location ~ \.php$ {
# 配置 FastCGI 服務地址,可以為 IP:埠,也可以為 Unix socket。
fastcgi_pass unix:/var/run/php/php7.2-fpm.sock;
# 配置 FastCGI 的主頁為 index.php。
fastcgi_index index.php;
# 配置 FastCGI 引數 SCRIPT_FILENAME 為 $realpath_root$fastcgi_script_name。
fastcgi_param SCRIPT_FILENAME $realpath_root$fastcgi_script_name;
# 引用更多預設的 FastCGI 引數。
include fastcgi_params;
}
# 通俗地說,以上配置將所有 URI 以 .php 結尾的請求,全部交給 PHP-FPM 處理。
# 除符合正規表示式 [/\.(?!well-known).*] 之外的 URI,全部拒絕訪問
# 也就是說,拒絕公開以 [.] 開頭的目錄,[.well-known] 除外
location ~ /\.(?!well-known).* {
deny all;
}
}
關於 X-Frame-Options
、X-XSS-Protection
和 X-Content-Type-Options
可參考 這篇文章,自認為作者講得還不錯,通俗易懂並且是中文。
關於 .well-known
目錄的詳細解釋,可參考 這篇問答(英文)。