标签搜索

关于Nginx的伪静态转发

You
You
2025-02-22 / 0 评论 / 94 阅读 / 正在检测是否收录...

今天准备做一个类似于防红的东西 但是本来是在改Nginx的配置文件 实现转发 刚开始是实现的了,后面稀里糊涂的又搞忘了。接着我就开始排查到底是怎么回事。

先是弄了一个测试的代码 开始测试

<?php
// 获取完整的当前请求 URL
$protocol = isset($_SERVER['HTTPS']) && $_SERVER['HTTPS'] === 'on' ? "https://" : "http://";
$domain = $_SERVER['HTTP_HOST'];
$uri = $_SERVER['REQUEST_URI'];
$fullUrl = $protocol . $domain . $uri;

// 解析 URL
$parsedUrl = parse_url($fullUrl);

// 输出 URL 的各个部分
echo "协议: ". ($parsedUrl['scheme']?? '无'). "<br>";
echo "域名: ". ($parsedUrl['host']?? '无'). "<br>";
echo "端口: ". ($parsedUrl['port']?? '无'). "<br>";
echo "路径: ". ($parsedUrl['path']?? '无'). "<br>";
echo "查询参数: ". ($parsedUrl['query']?? '无'). "<br>";
echo "锚点: ". ($parsedUrl['fragment']?? '无'). "<br>";
?>

调整了好久 发现是 ? 后面的就无法转发
然后询问豆包 告诉我
你理解的情况确实和 $is_args$args 变量有关,在原配置里它们主要用于处理 URL 中 ? 之后的查询字符串,而不是用来提取路径中的参数。要确保无论 URL 中是否有 ?,都能把 /bot 后面的路径部分作为参数传递给 get,可以按下面的方式修复 Nginx 配置。

原问题配置分析

location /bot {
    try_files $uri $uri/ /bot/url.php?get=$is_args$args;
}

这个配置存在问题,$is_args$args 仅处理 ? 之后的内容,没办法把 /bot 后面的路径作为参数传递给 get

修复后的配置

location ^~ /bot/ {
    rewrite ^/bot/(.*?)(\?.*)?$ /bot/url.php?get=$1$2 last;
}

详细解释

  • location ^~ /bot/

    • ^~ 前缀保证此 location 块会优先匹配以 /bot/ 开头的路径,避免被其他 location 块干扰。
  • rewrite ^/bot/(.*?)(\?.*)?$ /bot/url.php?get=$1$2 last;

    • 正则表达式 ^/bot/(.*?)(\?.*)?$

      • ^/bot/:匹配以 /bot/ 开头的路径。
      • (.*?):采用非贪婪模式匹配 /bot/ 后面的任意内容,将其捕获到 $1 中。
      • (\?.*)?(\?.*) 用于匹配 ? 及其后面的查询字符串,? 表示这部分是可选的,将其捕获到 $2 中。
    • 替换目标 /bot/url.php?get=$1$2

      • $1/bot/ 后面的路径部分。
      • $2 是原始的查询字符串(如果有的话)。
    • last 标志

      • 停止当前 location 块的处理,重新发起一个新的请求。

检查和应用配置

1. 语法检查

修改配置后,使用下面的命令检查 Nginx 配置文件的语法:

sudo nginx -t

若语法检查通过,会显示类似下面的信息:

nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginx.conf test is successful

2. 重新加载 Nginx 服务

若语法检查通过,使用下面的命令重新加载 Nginx 服务使配置生效:

sudo systemctl reload nginx

PHP 脚本接收参数

/bot/url.php 中,可以用以下代码接收参数:

<?php
// 接收 get 参数
$getParam = $_GET['get'] ?? '';

echo "get 参数: ". $getParam;
?>

通过以上步骤,不管 URL 里是否有 ?,都能把 /bot 后面的路径部分作为参数传递给 get

然后我将伪静态改成了

location /bot/url {
    try_files $uri $uri/ /bot/url.php?get=$is_args$args;
}

问题就解决了

0

评论 (0)

取消