Nginx Rewrite参数传递至PHP失效问题求助
解决Nginx Rewrite后PHP无法获取查询参数的问题
你遇到的问题核心是PHP不会自动将URL查询参数注册为全局变量——早年的register_globals选项早已被废弃(严重不安全),所以直接调用$redirect_reference肯定拿不到值。
第一步:修正PHP参数获取逻辑
把你的PHP代码改成用$_GET超全局数组获取参数:
<?php echo $_GET['redirect_reference'] . "\r\n";
第二步:结合短链接需求完善逻辑
针对你的短链接跳转场景,这里给你一套完整的示例代码,包含格式验证、数据库查询和跳转逻辑:
<?php // 获取短码,为空则直接跳主页 $shortCode = $_GET['redirect_reference'] ?? ''; // 验证短码格式(只允许数字和字母,避免恶意请求) if (preg_match('/^[0-9A-Za-z]+$/', $shortCode)) { // 这里替换成你的数据库查询逻辑 // 示例:从数据库中根据短码查询目标链接 // $pdo = new PDO('mysql:host=localhost;dbname=your_db', 'user', 'pass'); // $stmt = $pdo->prepare('SELECT target_url FROM short_links WHERE code = ?'); // $stmt->execute([$shortCode]); // $targetUrl = $stmt->fetchColumn(); // 假设查询到了有效链接,执行跳转 if (!empty($targetUrl)) { header("Location: $targetUrl"); exit; } } // 无效短码/未查到链接/恶意请求,统一跳主页 header("Location: https://www.example.com"); exit;
第三步:检查Nginx配置的正确性
确保你的rewrite规则配置正确,且没有被其他location规则干扰,完整的server配置示例:
server { server_name redirect.example.com; root /path/to/your/webroot; # 替换成你的项目根目录 location / { # 匹配短码格式的URL,重写到index.php并传递参数 rewrite ^/([0-9A-Za-z]*)$ /index.php?redirect_reference=$1 last; } # 处理PHP请求的location,确保fastcgi参数正确传递 location ~ \.php$ { fastcgi_pass unix:/run/php/php8.2-fpm.sock; # 根据你的PHP版本和FPM配置调整 fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; include fastcgi_params; } }
注意:rewrite规则后的last参数很重要,它会让Nginx重新匹配新的URL(也就是index.php),确保PHP能接收到查询参数。
内容的提问来源于stack exchange,提问作者Ron Piggott
相关产品推荐
相关产品推荐

