如何用PHP实现无问号的URL传参(仿domaintools.com格式)
实现PHP无问号URL传参的方案
嘿,我刚好折腾过类似的需求,这事儿其实核心靠URL重写配合PHP的全局变量就能搞定,分服务器配置和PHP代码处理两步,完全能实现像domaintools那样的news.com/football这种路径式传参:
第一步:配置服务器的URL重写规则
这一步是让服务器把看似静态的路径(比如/football)转发到PHP脚本处理,不同服务器配置略有区别:
Apache服务器
在你的网站根目录创建.htaccess文件,写入以下规则:
RewriteEngine On # 排除真实存在的文件和目录,避免影响静态资源访问 RewriteCond %{REQUEST_FILENAME} !-f RewriteCond %{REQUEST_FILENAME} !-d # 把URL路径(比如/football)作为topic参数传给index.php RewriteRule ^(.*)$ index.php?topic=$1 [L,QSA]
RewriteEngine On:开启重写引擎RewriteCond两行:确保只重写非真实文件/目录的请求,比如图片、CSS这些静态资源不会被干扰RewriteRule:把斜杠后的所有内容捕获为$1,作为topic参数传给index.php;L表示停止后续规则,QSA表示保留原URL的其他参数(比如如果有/football?foo=bar,会保留foo=bar)
Nginx服务器
在你的站点配置的server块中添加以下规则:
location / { # 先尝试访问真实文件/目录,找不到就转发到index.php try_files $uri $uri/ /index.php?$args; # 或者更精准的规则,专门处理路径参数: if (!-e $request_filename) { rewrite ^/(.*)$ /index.php?topic=$1 last; } }
注意要确保Nginx配置中已经正确设置了PHP的解析规则(比如通过fastcgi_pass连接PHP-FPM)。
第二步:PHP代码处理路径参数
现在服务器已经把路径参数传给PHP了,你可以在index.php里这样获取并使用:
基础单参数场景(比如news.com/football)
// 获取重写后的topic参数,默认值设为'default'以防空请求 $topic = isset($_GET['topic']) ? trim($_GET['topic']) : 'default'; // 接下来就可以根据$topic做逻辑处理,比如查询数据库 // 示例:模仿domaintools返回对应内容 if ($topic === 'football') { echo '足球板块内容'; } elseif ($topic === 'politics') { echo '政治板块内容'; } else { echo '默认首页内容'; }
多级路径场景(比如news.com/sports/football)
如果需要支持多级路径,直接解析$_SERVER['REQUEST_URI']更灵活:
// 去掉首尾的斜杠,分割路径为数组 $path = trim($_SERVER['REQUEST_URI'], '/'); $pathSegments = explode('/', $path); // 获取各级参数,用null合并运算符处理不存在的情况 $mainCategory = $pathSegments[0] ?? 'default'; $subCategory = $pathSegments[1] ?? ''; // 示例处理 echo "主分类:{$mainCategory},子分类:{$subCategory}";
一些重要的注意事项
- 服务器模块开启:Apache要确保
mod_rewrite模块已经启用;Nginx默认支持rewrite,但要确保配置文件正确加载。 - 安全校验:获取到参数后一定要做安全处理,比如用
htmlspecialchars()转义输出内容,操作数据库时使用预处理语句,防止SQL注入或XSS攻击。 - 复杂路由需求:如果你的项目有很多复杂的路由规则,可以考虑用PHP框架(比如Laravel、Symfony)的路由系统,它们已经封装好了更完善的路由处理逻辑,但原生PHP的方案足够应对大部分简单场景。
这样就能实现你想要的无问号URL传参效果,和domaintools处理/stackoverflow.com的逻辑完全一致——把URL路径作为业务参数传递给PHP,再根据参数返回对应内容。
内容的提问来源于stack exchange,提问作者Pepp
相关产品推荐
相关产品推荐

