如何配置Nginx让Laravel项目支持长尾词URL重写规则?

2026-04-24 19:042阅读0评论SEO教程
  • 内容介绍
  • 文章标签
  • 相关推荐

本文共计850个文字,预计阅读时间需要4分钟。

如何配置Nginx让Laravel项目支持长尾词URL重写规则?

对不起,您提供的内容似乎不完整。请提供完整的句子或段落,以便我能够帮助您进行简化或改写。

在 phpEnv 的 Nginx 站点配置里(通常位于 /etc/phpenv/nginx/sites-available/your-site),确认这一行:

root /path/to/your/laravel-project/public;

而不是:

root /path/to/your/laravel-project;

如果用了符号链接部署,还要确保 Nginx 启用了 follow_symlinks,否则 $realpath_root 无法正确解析路径。

立即学习“PHP免费学习笔记(深入)”;

location / 的 try_files 规则不能省,且必须带 $query_string

这是 Laravel 路由能工作的核心。phpEnv 的模板有时会漏掉查询参数传递,导致 ?page=2&sort=name 这类 URL 在重写后丢失参数,Laravel 的 Request 对象拿不到原始 query。

正确的写法是:

location / { try_files $uri $uri/ /index.php?$query_string; }

常见错误包括:

  • 写成 rewrite ^/(.*)$ /index.php?/$1 last; —— 会破坏 POST 数据和文件上传
  • 漏掉 $query_string,只写 /index.php —— 所有 GET 参数消失
  • location ~ \.php$ 块里又加一遍 try_files —— 导致 PHP-FPM 请求被拦截或绕过 Laravel 入口

PHP 处理块要防路径穿透,优先用 $realpath_root

phpEnv 的默认 PHP 配置可能沿用 $document_root,但在 symlink 部署场景下会出错:比如项目软链到 /var/www/myapp,但真实路径是 /home/user/projects/myapp$document_root 仍指向软链路径,导致 SCRIPT_FILENAME 构造错误,返回 500 或空白页。

应改为:

location ~ \.php$ { try_files $uri /index.php?$query_string; fastcgi_pass unix:/var/run/php/php8.1-fpm.sock; fastcgi_index index.php; fastcgi_param SCRIPT_FILENAME $realpath_root$fastcgi_script_name; include fastcgi_params; }

注意两点:

  • try_files $uri /index.php?$query_string; 放在 PHP 块开头,防止任意 .php/xxx 被直接解析(安全兜底)
  • $realpath_root$document_root 更可靠,能穿透符号链接拿到真实路径

子目录部署时 alias + rewrite 必须配对,不能只改 APP_URL

如果你把 Laravel 放在 phpEnv 的子路径下(比如 http://localhost/myapp/),光改 .env 里的 APP_URL 没用——生成的 URL 会错,静态资源仍 404,路由也进不了 index.php

必须在 Nginx 配置中显式处理子路径:

location ^~ /myapp/ { alias /path/to/your/laravel-project/public/; try_files $uri $uri/ @laravel; } location @laravel { rewrite ^/myapp/(.*)$ /myapp/index.php?/$1 last; }

关键细节:

  • alias 末尾必须带 /,否则 /myapp/css/app.css 会被映射成错误路径
  • 别用 root 替代 alias,否则多拼一层 myapp
  • rewrite 后的 last 是必须的,它让重写后的请求重新进入 location 匹配流程

真正容易被忽略的是:phpEnv 的全局配置可能通过 include 加载多个 conf 文件,比如 sites-enabled/*.confconf.d/*.conf,你改的配置可能被后面加载的文件覆盖。务必用 nginx -T | grep -A5 "location /" 查看最终生效的规则顺序。

本文共计850个文字,预计阅读时间需要4分钟。

如何配置Nginx让Laravel项目支持长尾词URL重写规则?

对不起,您提供的内容似乎不完整。请提供完整的句子或段落,以便我能够帮助您进行简化或改写。

在 phpEnv 的 Nginx 站点配置里(通常位于 /etc/phpenv/nginx/sites-available/your-site),确认这一行:

root /path/to/your/laravel-project/public;

而不是:

root /path/to/your/laravel-project;

如果用了符号链接部署,还要确保 Nginx 启用了 follow_symlinks,否则 $realpath_root 无法正确解析路径。

立即学习“PHP免费学习笔记(深入)”;

location / 的 try_files 规则不能省,且必须带 $query_string

这是 Laravel 路由能工作的核心。phpEnv 的模板有时会漏掉查询参数传递,导致 ?page=2&sort=name 这类 URL 在重写后丢失参数,Laravel 的 Request 对象拿不到原始 query。

正确的写法是:

location / { try_files $uri $uri/ /index.php?$query_string; }

常见错误包括:

  • 写成 rewrite ^/(.*)$ /index.php?/$1 last; —— 会破坏 POST 数据和文件上传
  • 漏掉 $query_string,只写 /index.php —— 所有 GET 参数消失
  • location ~ \.php$ 块里又加一遍 try_files —— 导致 PHP-FPM 请求被拦截或绕过 Laravel 入口

PHP 处理块要防路径穿透,优先用 $realpath_root

phpEnv 的默认 PHP 配置可能沿用 $document_root,但在 symlink 部署场景下会出错:比如项目软链到 /var/www/myapp,但真实路径是 /home/user/projects/myapp$document_root 仍指向软链路径,导致 SCRIPT_FILENAME 构造错误,返回 500 或空白页。

应改为:

location ~ \.php$ { try_files $uri /index.php?$query_string; fastcgi_pass unix:/var/run/php/php8.1-fpm.sock; fastcgi_index index.php; fastcgi_param SCRIPT_FILENAME $realpath_root$fastcgi_script_name; include fastcgi_params; }

注意两点:

  • try_files $uri /index.php?$query_string; 放在 PHP 块开头,防止任意 .php/xxx 被直接解析(安全兜底)
  • $realpath_root$document_root 更可靠,能穿透符号链接拿到真实路径

子目录部署时 alias + rewrite 必须配对,不能只改 APP_URL

如果你把 Laravel 放在 phpEnv 的子路径下(比如 http://localhost/myapp/),光改 .env 里的 APP_URL 没用——生成的 URL 会错,静态资源仍 404,路由也进不了 index.php

必须在 Nginx 配置中显式处理子路径:

location ^~ /myapp/ { alias /path/to/your/laravel-project/public/; try_files $uri $uri/ @laravel; } location @laravel { rewrite ^/myapp/(.*)$ /myapp/index.php?/$1 last; }

关键细节:

  • alias 末尾必须带 /,否则 /myapp/css/app.css 会被映射成错误路径
  • 别用 root 替代 alias,否则多拼一层 myapp
  • rewrite 后的 last 是必须的,它让重写后的请求重新进入 location 匹配流程

真正容易被忽略的是:phpEnv 的全局配置可能通过 include 加载多个 conf 文件,比如 sites-enabled/*.confconf.d/*.conf,你改的配置可能被后面加载的文件覆盖。务必用 nginx -T | grep -A5 "location /" 查看最终生效的规则顺序。