You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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配置里有几个关键问题导致了静态资源加载失败:

  1. 静态资源匹配规则完全错误:原配置中location /crm.(jpg|jpeg|gif|css|png|js|ico|html)$的写法只会匹配/crm.css这类奇怪的路径,根本覆盖不了/crm/css/app.css这种Laravel静态资源的实际路径。
  2. 全局rewrite规则干扰:那个判断非文件存在就重写为.php的规则,会把静态资源请求(比如/crm/css/app.css)强制改成/crm/css/app.css.php,直接触发404。
  3. /crm location的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;
    }
}

关键修改说明

  1. 移除危险的全局rewrite规则:原来的if (!-f $request_filename)重写规则会彻底破坏静态资源请求,改用location ~ \.php$专门处理PHP文件,同时加上try_files $uri =404避免无效请求,提升安全性。
  2. 修正静态资源匹配规则:新的location ~* ^/crm/(.+\.(jpg|jpeg|gif|css|png|js|ico|html))$会精准匹配/crm/下的所有静态资源,通过alias指向实际的文件存储路径。
  3. 使用内部重定向处理Laravel路由:添加@crm内部location,专门处理Laravel的路由转发,确保当请求的文件/目录不存在时,正确传递到index.php处理。
  4. 统一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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.29 07:08:15