nginx File not found 錯誤

2021-03-02 要屌不能絲

據說只有1%的人會去點

使用php-fpm解析PHP,"No input file specified","File not found"是令nginx新手頭疼的常見錯誤,原因是php-fpm進程找不到SCRIPT_FILENAME配置的要執行的.php文件,php-fpm返回給nginx的默認404錯誤提示。

比如我的網站doucument_root下沒有test.php,訪問這個文件時通過抓包可以看到返回的內容。

HTTP/1.1 404 Not Found
Date: Fri, 21 Dec 2012 08:15:28 GMT
Content-Type: text/html
Proxy-Connection: close
Server: nginx/1.2.5
X-Powered-By: PHP/5.4.7
Via: 1.1 c3300 (NetCache NetApp/6.0.7)
Content-Length: 16

File not found.

很多人不想用戶直接看到這個默認的404錯誤信息,想自定義404錯誤.

給出解決辦法前我們來先分析下如何避免出現這類404錯誤,然後再說真的遇到這種情況(比如用戶輸入一個錯誤不存在的路徑)時該怎麼辦,才能顯示自定義的404錯誤頁。

一、錯誤的路徑被發送到php-fpm進程

出現這類錯誤,十個有九個是後端fastcgi進程收到錯誤路徑(SCRIPT_FILENAME),而後端fastcgi收到錯誤路徑的原因大都是配置錯誤。

常見的nginx.conf的配置如下:

server { listen [::]:80; server_name example.com www.example.com; access_log /var/www/logs/example.com.access.log; location / { root /var/www/example.com; index index.html index.htm index.pl; } location /images { autoindex on; } location ~ \.php$ { fastcgi_pass 127.0.0.1:9000; fastcgi_index index.php; fastcgi_param SCRIPT_FILENAME /var/www/example.com$fastcgi_script_name; include fastcgi_params; }}

這個配置中有很多不合理的地方,其中一個明顯的問題就是root指令被放到了location / 塊。如果root指令被定義在location塊中那麼該root指令只能對其所在的location生效。其它locaiont中沒有root指令,像location /images塊不會匹配任何請求,需要在每個請求中重複配置root指令來解決這個問題。因此我們需要把root指令放在server塊,這樣各個location就會繼承父server塊定義的$document_root,如果某個location需要定義一個不同的$document_root,則可以在location單獨定義一個root指令。

另一個問題就是fastCGI參數SCRIPT_FILENAME 是寫死的。如果修改了root指令的值或者移動文件到別的目錄,php-fpm會返回「No input file specified」錯誤,因為SCRIPT_FILENAME在配置中是寫死的並沒有隨著$doucument_root變化而變化,我們可以修改SCRIPT_FILENAME配置如下:

fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;

所以我們不能忘記在server塊中配置root指令,不然$document_root的值為空,只會傳$fastcgi_script_name到php-fpm,這樣就會導致「No input file specified」錯誤。

二、請求的文件真的不存在

當nginx收到一個不在的.php文件的請求時,因為nginx只會檢查$uri是否是.php結尾,不會對文件是否存在進行判斷,.php結尾的請求nginx會直接發給php-fpm處理。php-fpm處理時找不到文件就會返回「No input file specified」帶著「404 Not Found」頭。

解決辦法

我們在nginx攔截不存在的文件,請求並返回自定義404錯誤

使用 try_files 捕捉不存在的urls並返回錯誤。

location ~ .php$ { try_files $uri =404; fastcgi_pass 127.0.0.1:9000; fastcgi_index index.php; fastcgi_param SCRIPT_FILENAME .... }

上面的配置會檢查.php文件是否存在,如果不存在,會返回404頁面。

轉載請註明本文地址:http://www.nginx.cn/562.html



相關焦點

  • 用 caddy 代替 nginx, 一行配置搞定 php-fpm 反向代理
    一是當時 nginx 還是非常堅挺, 可以說在 nginx + php-fpm 這一搭配方面, 基本上無敵手. 二是, 當時我試用過 Caddyfile 後,發現它太簡潔了,簡潔到我以配置 nginx 的思維, 完全無法適應配置 Caddyfile. 沒錯, 我當時覺得 , 配置 nginx 比 Caddyfile 簡單多了 (因為 nginx 配置已經熟練多年).
  • Nginx在高並發下的性能優化點!有這篇就夠了!
    open_file_cache_min_uses 1 :open_file_cache指令中的inactive 參數時間內文件的最少使用次數,如果超過這個數字,文件描述符一直是在緩存中打開的,如上例,如果有一個文件在inactive 時間內一次沒被使用,它將被移除。
  • 在Nginx使用Lua擴展功能
    其中Ngx_devel_kit的作用有2個:一是開發用的,二是可以在錯誤日誌中記錄Nginx處理階段信息(rewrite phase,access phase,content phase),需要將錯誤日誌級別調高,調試時可以設置成Debug。
  • nginx 502錯誤原因和解決辦法總結
    log文件,顯示的錯誤信息是:」413 Request Entity Too Large」, 於是在網上找了下「nginx 413錯誤」發現需要做以下設置:在nginx.conf增加 client_max_body_size的相關設置, 這個值默認是1m,可以增加到8m以增加提高文件大小限制;如果運行的是php,那麼還要檢查php.ini,這個大小client_max_body_size
  • nginx的location配置詳解
    訪問 http://localhost/category/id/1111 則最終匹配到規則H,因為以上規則都不匹配,這個時候應該是nginx轉發請求給後端應用伺服器,比如FastCGI(php),tomcat(jsp),nginx作為方向代理伺服器存在。
  • Nginx---高性能的HTTP和反向代理web伺服器
    worker_processes 8; #全局錯誤日誌定義類型,[ debug | info | notice | warn | error | crit ]error_log /usr/local/nginx/logs/error.log info;#進程pid文件pid /usr/local/nginx/logs/nginx.pid;
  • 現代程式設計師必須掌握的:Dockerfile 與 Compose 環境搭建學習筆記(二)
    在上篇的 docker-compose.yml 文件中如下的配置:dev.nginx.srv:    image: lei_nginx:1.14.0    build: ./nginx    volumes:        - ./nginx/conf:/home/work/app/nginx/conf      - .
  • Nginx主配置文件nginx.conf史上超細中文詳解
    .. 1第2章 nginx配置解釋圖解... 1第3章 Nginx核心配置文件nginx.conf史上最細中文詳解... 23.1 定義Nginx運行的用戶和用戶組... 23.2 nginxworker進程數,即處理請求的進程(熟稱負責接客的服務員)... 23.3 cpu親和力配置,讓不同的進程使用不同的cpu. 2
  • Dockerfile常用使用方法
    詳解Dockerfile是一個配置文件,可以自動執行創建Docker鏡像的步驟。Docker從Dockerfile中讀取指令,以自動執行原本手動執行的步驟來創建映像。要構建鏡像,請創建一個名為Dockerfile的文件。Dockerfile描述了組裝映像所需的步驟。創建Dockerfile後,調用docker build命令,使用包含Dockerfile的目錄的路徑作為參數。
  • file_put_contents+php-fpm如何命令執行
    本文學習file_put_contents + FTP + php-fpm的命令執行。原理參考[2],我們可以得知,PHP-FPM未授權訪問時,可以通過修改變量auto_prepend_file或auto_append_file來執行文件。根據[1]中描述,我們需要讓file_put_contents時,將結果寫到php-fpm,這樣造成命令執行。
  • nginx配置location總結及rewrite規則寫法
    #這裡是直接轉發給後端應用伺服器了,也可以是一個靜態首頁# 第一個必選規則location = / { proxy_pass http:}# 第二個必選規則是處理靜態文件請求,這是nginx作為http伺服器的強項# 有兩種配置模式,目錄匹配或後綴匹配,任選其一或搭配使用location ^~ /static/ { root /webroot/static/;}location ~* \
  • Docker 快速入門之 Dockerfile
    答案當然是可以的,在 Docker 中我們可以從名為 Dockerfile 的文件中讀取指令並且自動構建鏡像。在本文中,將介紹 Dockerfile 的基本語法以及基本知識。1、Dockerfile 是什麼?Dockerfile 其實是一份文本文檔,裡面包含了用戶可以用來操作鏡像的一些指令。
  • Nginx與Lua的執行順序和步驟說明
    例如lua_shared_dict共享內存的申請,只有當nginx重起後,共享內存數據才清空,這常用於統計。該階段不能運行Output API、Control API、Subrequest API、Cosocket APItimer:三、ngx_lua運行指令ngx_lua屬於nginx的一部分,它的執行指令都包含在nginx的11個步驟之中了,不過ngx_lua並不是所有階段都會運行的;1、init_by_lua、init_by_lua_file
  • 安裝Mysql報錯:RSA private key file not found
    安裝mysql報錯[Note] RSA private key file
  • Nginx + PHP(php-fpm)遇到的502 Bad Gateway錯誤
    使用Nginx經常會跳出502錯誤,錯誤當然不能忽略。Nginx才剛剛開始用,有問題就有進步的機會。下面就研究一下問題原因。先查看錯誤日誌,Nginx跟Apache不同之處在於PHP的腳本錯誤不會出在Nginx的log中,所以當出現502錯誤的時候,必須查看php-fpm的log,下一篇介紹如何調出php-fpm的具體錯誤log。
  • Dockerfile 簡版大全,附贈編寫實例
    Bootstrapping安裝Nginx後,我們需要配置Nginx並且替換掉默認的配置文件# Remove the default Nginx configuration fileRUN rm -v /etc/nginx/nginx.conf# Copy a configuration file from
  • 雲計算核心技術Docker教程:Dockerfile指令詳解
    示例:假設已通過 Dockerfile 構建了 nginx:test 鏡像:FROM nginxENTRYPOINT ["nginx", "-c"] # 定參CMD ["/etc/nginx/nginx.conf
  • 來自官方映像的 6 個 Dockerfile 技巧
    比如,為了驗證nginx包,nginx的Dockerfile會做如下操作: RUN apt-key adv --keyserver pgp.mit.edu --recv-keys 573BFD6B3D8FBC641079A6ABABF5BD827BD9BF62RUN echo "deb http://nginx.org/packages/mainline/debian/ wheezy
  • 【實戰】基於Nginx、Node.js和Redis的Docker工作流
    我將使用一個Dockerfile以及我自定義的Nginx conf文件配置Nignx。該Dockerfile是最小的-使用Nginx鏡像和副本自定義Nginx的配置:# Set nginx base imageFROM nginx# File Author / MaintainerMAINTAINER Anand Mani Sankar# Copy custom configuration file from the current directoryCOPY
  • 從0開始,在Linux中配置Nginx反向代理、負載均衡、session共享、動靜分離
    這裡簡單介紹基本信息配置的含義:sbin-path:sbin即binary file,為Nginx 命令文件存放目錄modules-path:Nginx 模塊存放路徑error-log-path:錯誤日誌文件存放路徑pid-path:Nginx 的進程 id 存放路徑user:為Nginx的工作進程創建所屬用戶,如果不創建,則默認為nobody