NGINX配置Laravel路由问题:根路径匹配与正则路由块实现
解决Nginx部署Laravel+静态页面的路由问题
问题1:路由前缀丢失导致匹配异常的修复
你的问题根源是Nginx转发请求时截断了/api、/tinker这类前缀,导致Laravel收到的请求URI缺失前缀,因此出现:
- 访问
/api/v1/myroute时,Laravel只能匹配/v1/myroute - 第三方包的
/tinker路由需要通过/tinker/tinker访问(Nginx去掉/tinker后转发给Laravel,Laravel收到的是/,此时访问路径的/tinker加上Laravel内部的/tinker路由,就变成了/tinker/tinker)
修复后的Laravel路由Nginx配置
不要截断请求URI,完整转发给Laravel的index.php:
# 匹配/api、/auth、/logs、/tinker开头的所有请求,交给Laravel处理 location ~ ^/(api|auth|logs|tinker) { root /path/to/laravel/public; try_files $uri $uri/ /index.php$is_args$args; # FastCGI配置(根据你的PHP环境调整) fastcgi_pass unix:/run/php/php8.2-fpm.sock; fastcgi_index index.php; fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; include fastcgi_params; }
配置后,Laravel会收到完整的请求URI,你可以正常定义/api/v1/myroute这类路由,第三方包的/tinker、/logs也能直接通过原路径访问。
问题2:正则匹配路由块的正确写法
你尝试的^/(api|auth)方向正确,但需要遵循Nginx的正则匹配规则:
- 用
~表示区分大小写的正则匹配(~*为不区分大小写) - 正则
^/(api|auth|logs|tinker)表示匹配以指定前缀开头的所有请求 - 注意匹配优先级:正则匹配优先级高于普通前缀匹配,需将Laravel的正则location写在静态页面的location之前
完整Nginx配置示例
server { listen 80; server_name your-domain.com; # 前端静态页面根目录 root /path/to/frontend/dist; index index.html; # 处理Laravel专属路由 location ~ ^/(api|auth|logs|tinker) { root /path/to/laravel/public; try_files $uri $uri/ /index.php$is_args$args; fastcgi_pass unix:/run/php/php8.2-fpm.sock; fastcgi_index index.php; fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; include fastcgi_params; } # 所有其他请求返回前端静态HTML location / { try_files $uri $uri/ /index.html; } }
关键注意点
- 确保
root路径正确:Laravel的location指向项目public目录,前端location指向静态文件根目录 try_files $uri $uri/ /index.php$is_args$args;的作用是:先尝试访问请求的文件/目录,不存在则转发给index.php并保留查询参数- 正则不要遗漏
^:确保只匹配指定前缀开头的请求,避免误匹配其他路径
内容的提问来源于stack exchange,提问作者Gerardo
相关产品推荐
相关产品推荐

