Laravel 5.5+Nginx二级目录下CSS/JS 404问题求助
问题背景
你当前的环境:
- Laravel 5.5 全新安装
- Nginx版本:nginx/1.10.3 (Ubuntu)
访问http://<my-ip>/crm/时Laravel欢迎页正常加载,静态资源也能正确获取,但访问http://<my-ip>/crm/register时,CSS/JS等静态资源出现404错误。
问题分析
你的Nginx配置里有几个关键问题导致了静态资源加载失败:
- 静态资源匹配规则完全错误:原配置中
location /crm.(jpg|jpeg|gif|css|png|js|ico|html)$的写法只会匹配/crm.css这类奇怪的路径,根本覆盖不了/crm/css/app.css这种Laravel静态资源的实际路径。 - 全局rewrite规则干扰:那个判断非文件存在就重写为
.php的规则,会把静态资源请求(比如/crm/css/app.css)强制改成/crm/css/app.css.php,直接触发404。 /crmlocation的try_files配置不当:使用alias时,try_files的最后一个参数应该用内部重定向(比如@crm),而不是直接指向/index.php,否则会导致路径解析混乱。
修正后的完整Nginx配置
server { listen 80 default_server; listen [::]:80 default_server; root /var/www/html; index index.php index.html index.htm; server_name _; # 保留原有业务的rewrite规则,不做改动 rewrite ^/((?!en)[a-z]*)/home$ /index.php?lang=$1&$args last; rewrite ^/((?!en)[a-z]*)/sitemap.xml$ /sitemap.xml last; rewrite /pigeon/(.*)$ /pigeon/index.php?/ last; # 全局基础路由处理 location / { try_files $uri $uri/ /index.php$is_args$args; } # 统一处理PHP请求,添加安全校验 location ~ \.php$ { include snippets/fastcgi-php.conf; fastcgi_param SCRIPT_FILENAME $request_filename; fastcgi_pass unix:/var/run/php/php7.0-fpm.sock; # 只处理存在的PHP文件,避免无效请求 try_files $uri =404; } # pigeon项目的配置(保留原有逻辑,补充安全校验) location /pigeon { alias /var/www/html/pigeon/public; try_files $uri $uri/ @pigeon; location ~ \.php$ { include snippets/fastcgi-php.conf; fastcgi_param SCRIPT_FILENAME $request_filename; fastcgi_pass unix:/var/run/php/php7.0-fpm.sock; try_files $uri =404; } } # 修正后的crm项目配置 location /crm { alias /var/www/html/crm/public; try_files $uri $uri/ @crm; # 正确匹配crm下的静态资源,优化缓存和日志 location ~* ^/crm/(.+\.(jpg|jpeg|gif|css|png|js|ico|html))$ { access_log off; expires max; # 配合alias指向真实的静态文件路径 alias /var/www/html/crm/public/$1; } location ~ \.php$ { include snippets/fastcgi-php.conf; fastcgi_param SCRIPT_FILENAME $request_filename; fastcgi_pass unix:/var/run/php/php7.0-fpm.sock; try_files $uri =404; } } # crm项目的路由内部重定向规则,处理Laravel的URL重写 location @crm { rewrite ^/crm/(.*)$ /crm/index.php?$1 last; } # pigeon项目的路由内部重定向规则 location @pigeon { rewrite ^/pigeon/(.*)$ /pigeon/index.php?$1 last; } }
关键修改说明
- 移除危险的全局rewrite规则:原来的
if (!-f $request_filename)重写规则会彻底破坏静态资源请求,改用location ~ \.php$专门处理PHP文件,同时加上try_files $uri =404避免无效请求,提升安全性。 - 修正静态资源匹配规则:新的
location ~* ^/crm/(.+\.(jpg|jpeg|gif|css|png|js|ico|html))$会精准匹配/crm/下的所有静态资源,通过alias指向实际的文件存储路径。 - 使用内部重定向处理Laravel路由:添加
@crm内部location,专门处理Laravel的路由转发,确保当请求的文件/目录不存在时,正确传递到index.php处理。 - 统一PHP请求的安全校验:为所有PHP location添加
try_files $uri =404,这是Nginx的最佳实践,防止FastCGI处理不存在的PHP文件。
验证步骤
修改配置后,执行命令重启Nginx:
sudo systemctl restart nginx
然后访问http://<my-ip>/crm/register,检查静态资源是否正常加载;如果还有问题,可以查看Nginx错误日志/var/log/nginx/error.log排查细节。
内容的提问来源于stack exchange,提问作者erezt
相关产品推荐
相关产品推荐

