网站如何用URL短横线替代PHP的$_GET获取信息?附Reddit实例
实现类似Reddit的友好URL替代$_GET传参
嘿,这个问题问得特别好!你说的这种像Reddit那样干净又语义化的URL,叫做友好URL(或RESTful URL),它并不是直接替代$_GET,而是通过Web服务器的重写规则,把美观的URL转换成PHP能处理的内部请求,再手动解析出需要的参数。下面一步步给你讲清楚:
1. 先配置Web服务器的重写规则
核心思路是:把所有非文件/非目录的请求,都转发到一个入口文件(比如index.php),让PHP来统一处理。
Apache服务器(用.htaccess文件)
在你的网站根目录创建.htaccess文件,写入以下规则:
RewriteEngine On # 如果请求的不是真实文件,跳过 RewriteCond %{REQUEST_FILENAME} !-f # 如果请求的不是真实目录,跳过 RewriteCond %{REQUEST_FILENAME} !-d # 把整个URL路径作为`url`参数传给index.php RewriteRule ^(.*)$ index.php?url=$1 [L,QSA]
Nginx服务器(修改配置文件)
在你的站点配置的server块里添加这段规则:
location / { # 先尝试访问真实文件/目录,不存在就转发到index.php try_files $uri $uri/ /index.php?url=$request_uri; }
2. 在PHP中解析URL路径参数
现在所有请求都会走到index.php,我们可以从$_GET['url']里拿到完整的URL路径,再拆分出需要的信息。
比如Reddit的URL:/r/AskReddit/comments/7onp85/what_can_you_add_to_mac_n_cheese_to_make_it_even/,我们可以这样解析:
// 获取重写后的URL路径,去掉首尾的斜杠 $url = isset($_GET['url']) ? trim($_GET['url'], '/') : ''; // 用斜杠分割成数组 $pathParts = explode('/', $url); // 从数组里提取需要的参数 $subredditName = $pathParts[1] ?? ''; // 拿到AskReddit $postId = $pathParts[3] ?? ''; // 拿到帖子ID:7onp85 $postTitle = $pathParts[4] ?? ''; // 拿到短横线连接的标题
如果是纯短横线分割的URL(比如/post-mac-n-cheese-123),就用短横线分割:
$url = isset($_GET['url']) ? $_GET['url'] : ''; $parts = explode('-', $url); $postType = $parts[0] ?? ''; // post $postSlug = implode('-', array_slice($parts, 1, -1)) ?? ''; // mac-n-cheese $postId = $parts[count($parts)-1] ?? ''; // 123
3. 根据参数路由到对应业务逻辑
拿到参数后,就可以根据这些值调用对应的功能了,比如:
// 判断是子版块页面还是帖子详情页 if (!empty($pathParts[0]) && $pathParts[0] === 'r' && !empty($pathParts[1])) { // 加载子版块页面 showSubreddit($subredditName); } elseif (!empty($pathParts[2]) && $pathParts[2] === 'comments' && !empty($postId)) { // 加载帖子详情页,这里标题其实主要是SEO用,核心用postId就行 showPost($postId); }
额外说明
这种友好URL的好处不止是好看,还更利于搜索引擎优化(SEO),用户也更容易记住和分享。而且可以轻松实现RESTful风格的接口,让URL语义化更强。
内容的提问来源于stack exchange,提问作者user2350459
相关产品推荐
相关产品推荐

