Ubuntu PHP日志中404错误的解决方法
首先确认访问的URL是否存在拼写错误、大小写不一致或多余的斜杠(如/page/../index.php
)。动态URL中的参数错误(如/product?id=123
中的id
不存在)也可能导致404,需检查前端链接或表单提交的URL是否与后端预期一致。
通过SSH登录服务器,使用ls -l /path/to/file
命令检查请求的文件或目录是否存在。特别注意:
$_SERVER['DOCUMENT_ROOT'].'/uploads/image.jpg'
)是否因路径拼接错误指向不存在的位置;mv
命令误操作或脚本逻辑错误)。DocumentRoot
指令指向正确的网站根目录(如/var/www/html
或项目专用目录),路径需与URL中的路径匹配;.htaccess
文件中的重写规则(如RewriteRule ^(.*)$ index.php?url=$1 [QSA,L]
),错误的规则可能将合法请求重定向到不存在的路径。可通过sudo apache2ctl -t
测试配置语法,无误后重启Apache:sudo systemctl restart apache2
。root
指令指向项目的public
目录(如/var/www/phpproject/public
),这是框架(如ThinkPHP、Laravel)处理请求的入口;location
块中的try_files
指令(如try_files $uri $uri/ /index.php?$args;
),该指令需将不存在的静态文件请求转发到index.php
(框架路由处理);location ~ \.php$
):fastcgi_pass
需指向PHP-FPM的监听地址(如unix:/run/php/php8.2-fpm.sock
或127.0.0.1:9000
),fastcgi_param SCRIPT_FILENAME
需正确设置为$document_root$fastcgi_script_name
(确保PHP-FPM能找到脚本文件)。修改配置后,用sudo nginx -t
测试语法,重启Nginx:sudo systemctl restart nginx
。sudo systemctl status php8.2-fpm
(根据PHP版本调整,如php7.4-fpm
),若未运行,启动服务:sudo systemctl start php8.2-fpm
;pool.d/www.conf
文件(通常在/etc/php/8.2/fpm/pool.d/
),确认listen
指令与Nginx的fastcgi_pass
一致(如listen = /run/php/php8.2-fpm.sock
);www-data
)有权限访问PHP-FPM的socket文件:sudo chown www-data:www-data /run/php/php8.2-fpm.sock
(若为sock文件)或sudo chmod 755 /run/php/php8.2-fpm.sock
(若为目录)。Ubuntu系统中,Web服务器用户(www-data
)需要对项目文件和目录有适当的访问权限:
755
(drwxr-xr-x
),允许用户读取和执行(进入目录);644
(-rw-r--r--
),允许用户读取(查看文件内容)。sudo find /var/www/phpproject -type d -exec chmod 755 {} \;
sudo find /var/www/phpproject -type f -exec chmod 644 {} \;
若项目需要上传文件,uploads
目录需设置为775
(drwxrwxr-x
),确保www-data
用户可写入。
框架的路由规则可能拦截请求并转发到不存在的控制器或方法:
route/app.php
、Laravel的routes/web.php
)中定义了对应的路由规则;/user/profile/123
需对应路由规则Route::get('user/profile/{id}', 'UserController@show')
),参数缺失或错误会导致404;/var/log/apache2/error.log
(Apache)或/var/log/nginx/error.log
(Nginx),使用sudo tail -f /var/log/nginx/error.log
实时查看最新错误,获取更具体的错误信息(如“Primary script unknown”表示PHP-FPM无法找到脚本文件);/var/log/php8.2-fpm.log
(路径可能因系统配置不同),检查是否有“Permission denied”(权限问题)或“No input file specified”(路径配置错误)等日志。Ctrl+F5
强制刷新页面,清除浏览器缓存的旧页面;sudo systemctl restart nginx # 或apache2
sudo systemctl restart php8.2-fpm