LNMP部署Laravel Livewire报Livewire is not defined如何修复
问题描述
Laravel Livewire项目部署到LNMP环境(Nginx为Web服务器)时,livewire.js无法正常加载,浏览器控制台抛出如下错误:
Livewire is not defined
已知可通过发布静态资源的方式修复:执行php artisan livewire:publish将vendor目录下相关文件复制到项目public目录,但该方案后续升级Livewire时需要手动同步更新JS文件,不采用该方案。经排查判断问题为Nginx拦截了Livewire的JS动态响应,当前服务器Nginx全局配置如下:
user www www; worker_processes auto; error_log /www/wwwlogs/nginx_error.log crit; pid /www/server/nginx/logs/nginx.pid; worker_rlimit_nofile 51200; events { use epoll; worker_connections 51200; multi_accept on; } http { #AAPANEL_FASTCGI_CONF_BEGIN fastcgi_cache_key "$scheme$request_method$host$request_uri"; fastcgi_cache_path /dev/shm/nginx-cache/wp levels=1:2 keys_zone=WORDPRESS:100m inactive=60m max_size=1g; fastcgi_cache_use_stale error timeout invalid_header http_500; fastcgi_ignore_headers Cache-Control Expires Set-Cookie; #AAPANEL_FASTCGI_CONF_END include mime.types; #include luawaf.conf; include proxy.conf; default_type application/octet-stream; server_names_hash_bucket_size 512; client_header_buffer_size 32k; large_client_header_buffers 4 32k; client_max_body_size 50m; sendfile on; tcp_nopush on; keepalive_timeout 60; tcp_nodelay on; fastcgi_connect_timeout 300; fastcgi_send_timeout 300; fastcgi_read_timeout 300; fastcgi_buffer_size 64k; fastcgi_buffers 4 64k; fastcgi_busy_buffers_size 128k; fastcgi_temp_file_write_size 256k; fastcgi_intercept_errors on; gzip on; gzip_min_length 1k; gzip_buffers 4 16k; gzip_http_version 1.1; gzip_comp_level 2; gzip_types text/plain application/javascript application/x-javascript text/javascript text/css application/xml; gzip_vary on; gzip_proxied expired no-cache no-store private auth; gzip_disable "MSIE [1-6]\."; limit_conn_zone $binary_remote_addr zone=perip:10m; limit_conn_zone $server_name zone=perserver:10m; server_tokens off; access_log off; server { listen 888; server_name phpmyadmin; index index.html index.htm index.php; root /www/server/phpmyadmin; location ~ /tmp/ { return 403; } #error_page 404 /404.html; include enable-php.conf; location ~ .*\.(gif|jpg|jpeg|png|bmp|swf)$ { expires 30d; } location ~ .*\.(js|css)?$ { expires 12h; } location ~ /\. { deny all; } access_log /www/wwwlogs/access.log; } include /www/server/panel/vhost/nginx/*.conf; }
问题根源
你贴出的配置中,带js/css缓存规则的是phpMyAdmin站点的配置,并非Laravel项目的站点配置。aaPanel/宝塔面板默认生成的Laravel站点Nginx配置中,会对所有.js/.css后缀的请求直接匹配静态文件读取规则,不会将请求转发给PHP解析。
Livewire默认的/livewire/livewire.js是框架注册的动态路由,不存在实际的静态文件,请求被Nginx静态规则拦截后直接返回404,前端无法加载到对应的JS文件,就会抛出Livewire is not defined错误。
修复步骤
- 打开Laravel项目对应的Nginx虚拟主机配置文件,路径为配置中指定的
/www/server/panel/vhost/nginx/目录,找到对应域名的.conf文件编辑,不要修改全局Nginx配置或phpMyAdmin的站点配置。 - 在配置中找到匹配js/css静态资源的location块,通常内容如下:
location ~ .*\.(js|css)?$ { expires 12h; error_log /dev/null; access_log off; }
- 在该静态规则的上方新增一条优先级更高的规则,优先放行Livewire的动态JS请求,转发给PHP处理:
# 放行Livewire动态JS路由 location ^~ /livewire/livewire.js { expires off; try_files $uri $uri/ /index.php?$query_string; }
如果自定义过Livewire的静态资源路径,将规则中的路径替换为实际配置的路径即可。
- 保存配置文件后,执行命令验证配置语法是否正确:
nginx -t
- 语法验证通过后,重载Nginx配置使规则生效:
nginx -s reload
- 清理浏览器缓存后强制刷新页面即可恢复正常。
验证方式
直接在浏览器访问https://你的项目域名/livewire/livewire.js,如果能正常返回JS代码内容而非404页面,说明规则已经生效。
内容的提问来源于stack exchange,提问作者DIGITAL JEDI
相关产品推荐
相关产品推荐

