今天准备做一个类似于防红的东西 但是本来是在改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 successful2. 重新加载 Nginx 服务
若语法检查通过,使用下面的命令重新加载 Nginx 服务使配置生效:
sudo systemctl reload nginxPHP 脚本接收参数
在 /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)