如何配置Nginx让Laravel项目支持长尾词URL重写规则?
- 内容介绍
- 文章标签
- 相关推荐
本文共计850个文字,预计阅读时间需要4分钟。
对不起,您提供的内容似乎不完整。请提供完整的句子或段落,以便我能够帮助您进行简化或改写。
在 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/*.conf 或 conf.d/*.conf,你改的配置可能被后面加载的文件覆盖。务必用 nginx -T | grep -A5 "location /" 查看最终生效的规则顺序。
本文共计850个文字,预计阅读时间需要4分钟。
对不起,您提供的内容似乎不完整。请提供完整的句子或段落,以便我能够帮助您进行简化或改写。
在 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/*.conf 或 conf.d/*.conf,你改的配置可能被后面加载的文件覆盖。务必用 nginx -T | grep -A5 "location /" 查看最终生效的规则顺序。

