Nginx部署Laravel必须将root指向public目录,否则路由404且.env可被下载;需正确配置try_files、PHP-FPM、禁止敏感文件访问,并启用HTTPS透传。

在Nginx环境部署Laravel安装后,必须将Web服务器根目录精确指向public子目录,否则所有路由返回404且.env等敏感文件可被直接下载——这不是权限问题,是路径配置错误引发的双重故障。
确认项目结构与权限
进入你的Laravel项目根目录(如/var/www/myapp),执行ls -la,确保存在public/子目录且其中包含index.php。若无此目录,说明Composer安装未完成或项目克隆不完整,需重新执行composer create-project laravel/laravel .。
运行sudo chown -R www-data:www-data /var/www/myapp,使Nginx工作进程能读取代码;再执行sudo chmod -R 755 /var/www/myapp/storage /var/www/myapp/bootstrap/cache,确保Laravel运行时可写日志与缓存——【storage和bootstrap/cache不可设为777,否则触发Laravel安全拦截】。
修改Nginx站点配置文件
打开站点配置文件,通常位于/etc/nginx/sites-available/your-site或/etc/nginx/conf.d/default.conf。
将root指令值改为Laravel项目中public目录的绝对路径,例如:root /var/www/myapp/public;。这一步不可省略,也不能用alias替代——【root必须是public目录,不是项目根目录,否则访问https://yoursite.com/.env会直接下载明文配置】。
在server块内添加以下location /规则:
location / { try_files $uri $uri/ /index.php?$query_string; }
该行确保所有非物理文件请求(如/users、/api/posts)全部转发至index.php,由Laravel内核接管路由分发;漏掉它,Nginx对任何动态路径都返回404。
配置PHP-FPM处理模块
方法一:标准PHP-FPM socket配置(推荐)
在配置文件中添加以下location ~ \.php$块:
location ~ \.php$ { fastcgi_pass unix:/var/run/php/php8.2-fpm.sock; fastcgi_index index.php; fastcgi_param SCRIPT_FILENAME $realpath_root$fastcgi_script_name; include fastcgi_params; }
注意fastcgi_pass路径需与你实际运行的PHP-FPM版本匹配,可用sudo systemctl status php*-fpm确认服务名;$realpath_root比$document_root更可靠,能规避符号链接导致的No input file specified错误。
方法二:TCP端口方式(仅当socket不可用时启用)
若PHP-FPM监听127.0.0.1:9000,则将fastcgi_pass改为127.0.0.1:9000,并确保PHP-FPM配置中listen = 127.0.0.1:9000且listen.allowed_clients = 127.0.0.1已启用。
加固与HTTPS透传
第一步:禁止敏感文件访问
在server块中添加:
location ~ /\.(env|git|htaccess|php~|bak|swp)$ { deny all; }
该规则阻止通过URL直接获取.env、Git元数据、临时备份等高危文件,防止源码泄露。
第二步:启用HTTPS头透传(仅限HTTPS server块)
若使用SSL,必须在对应server { listen 443 ssl; ... }块中加入:
fastcgi_param HTTPS on;
同时检查.env中APP_URL=https://yoursite.com,否则url()、asset()生成的链接仍为HTTP协议。
第三步:验证并重载Nginx
执行sudo nginx -t检查语法,输出successful后运行sudo systemctl reload nginx。此时访问域名应显示Laravel欢迎页,而非404或PHP源码。


















