首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 網頁程式設計 >> PHP 程式設計 >> PHP 相關知識

Nginx 403 Forbidden 常見誤區:index 指令缺失導致靜態頁面無法訪問

     編輯:PHP 相關知識

Nginx 403 Forbidden 常見誤區:index 指令缺失導致靜態頁面無法訪問

部署 DedeCMS 等靜態化生成系統時,常遇到「生成靜態頁面後,欄目頁面全部 403 Forbidden」。經排查,**並非權限問題,而是 Nginx `index` 指令配置缺失 `index.html`** 導致。本文詳細分析 403 成因、排查步驟、修正配置與預防清單。

現象重現

  • 網站根目錄有 `index.php`,首頁正常。
  • 開啟 DedeCMS「一鍵生成靜態」,產生欄目頁 `list_1.html`、文章頁 `article_1.html` 等。
  • 訪問 `https://domain/list_1.html` → **403 Forbidden**。
  • 訪問 `https://domain/list_1.html` 手動加上文件名 → 正常。
  • 訪問欄目目錄 `https://domain/category/` → **403 Forbidden**。

根因分析

# 原錯誤配置
server {
    listen 80;
    server_name domain.com;
    root /var/www/html;
    index index.php;  # <=== 只有 index.php,缺少 index.html / index.htm
    location / {
        try_files $uri $uri/ /index.php?$query_string;
    }
    location ~ \.php$ {
        fastcgi_pass unix:/run/php/php7.4-fpm.sock;
        fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
        include fastcgi_params;
    }
}

流程:

  1. 用戶請求 `/category/` (目錄)。
  2. Nginx 在 `root` 目錄下尋找 `index` 指令列出的文件:`index.php`。
  3. 目錄下**不存在** `index.php` (靜態頁是 `index.html`)。
  4. `try_files $uri $uri/` 進入第二階段 `$uri/` (目錄)。
  5. Nginx 預設 `autoindex off`,**禁止目錄列表**,返回 **403 Forbidden**。

修正配置

server {
    listen 80;
    server_name domain.com;
    root /var/www/html;
    # 關鍵修正:按優先序列出所有可能的索引文件
    index index.html index.htm index.php;

    location / {
        try_files $uri $uri/ /index.php?$query_string;
    }
    # ... PHP 處理同上
}

重載:`nginx -s reload` 即時生效。

403 Forbidden 其他常見成因速查表

成因檢查方法解決
文件/目錄權限錯誤`ls -l` 確認 Nginx 用戶 (www-data/nginx) 可讀`chown -R www-data:www-data /var/www/html`、`chmod -R 755` 目錄、`644` 文件
root 路徑錯誤確認 `root` 指向正確目錄修正 `root` 指令
location 匹配順序錯誤靜態文件 location 被 PHP location 搶先調整 location 順序,`location ~ \.php$` 放後
autoindex off (預設)請求目錄且無 index 文件添加 index 文件、或特定目錄 `autoindex on`
SELinux/AppArmor 限制`ausearch -m avc` / `aa-status`調整安全策略或標籤 `chcon -Rt httpd_sys_content_t`
fastcgi 權限PHP-FPM 用戶無法讀取腳本統一 PHP-FPM 與 Nginx 用戶組

預防部署清單

  1. 靜態化系統**必須**在 `index` 指令包含 `index.html index.htm`。
  2. 生成靜態後,用 `curl -I https://domain/category/` 驗證返回 200。
  3. 配置 `error_log` 記錄 403 詳細資訊:`error_log /var/log/nginx/error.log warn;`。
  4. 使用 `nginx -t` 測試配置語法後再 reload。
  5. 版本控制 Nginx 配置 (Git),變更可追溯。

延伸閱讀

更多 Nginx 進階:`try_files` 進階用法、FastCGI 快取優化、SSL/TLS 配置最佳實踐、限流限速 (limit_req/limit_conn)、反向代理負載均衡、日誌分析與 GoAccess 視覺化、Docker 化 Nginx 部署、OpenResty Lua 動態路由,請參考本站專題系列。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved