PHP博客如何移除URL中Slug参数实现简洁伪静态链接
URL简洁化实现方案
你的需求完全可以通过.htaccess实现,也可以根据你用的Web服务器选其他方案,核心逻辑都是把简洁URL里的文章别名自动传给你现有代码里的$_GET['slug'],几乎不用改原有业务代码。
Apache环境:.htaccess重写规则(推荐)
如果你用的是Apache服务器,直接在网站根目录创建或修改.htaccess文件,写入以下规则,就能实现域名/postname-title的访问效果:
RewriteEngine On # 跳过真实存在的文件、目录,避免静态资源、后台脚本被误重写 RewriteCond %{REQUEST_FILENAME} !-f RewriteCond %{REQUEST_FILENAME} !-d # 将路径内容自动传给slug参数 RewriteRule ^(.*)$ Post.php?slug=$1 [L,QSA]
规则生效后,用户访问域名/xxx-post-slug时,服务器会在后台自动转发到Post.php?slug=xxx-post-slug,你原来写的$_GET["slug"]查询逻辑完全不用改就能正常跑。
如果要实现Post.php/postname-title的格式,不需要额外改重写规则,只要在Post.php开头加一段兼容PATH_INFO的代码即可:
// 兼容PATH_INFO传参 if (empty($_GET['slug']) && isset($_SERVER['PATH_INFO'])) { $_GET['slug'] = ltrim($_SERVER['PATH_INFO'], '/'); }
Nginx环境:站点配置重写
如果你用的是Nginx服务器,不支持.htaccess,直接在站点对应的server配置块里加以下规则,效果和Apache规则一致:
location / { try_files $uri $uri/ @post_rewrite; } location @post_rewrite { rewrite ^/(.*)$ /Post.php?slug=$1 last; }
改完重载Nginx配置就生效,原有PHP代码不用调整。
无服务器修改权限:纯PHP适配
如果你没法改Web服务器配置,也可以直接调整PHP代码适配Post.php/postname-title格式的URL,只需要把Post.php开头获取slug的逻辑替换成下面的代码即可:
<?php // 兼容GET参数和PATH_INFO两种传参方式 $slug = ''; if (isset($_GET['slug'])) { $slug = trim($_GET['slug']); } elseif (isset($_SERVER['PATH_INFO'])) { $slug = trim(ltrim($_SERVER['PATH_INFO'], '/')); } // 先判断slug是否为空,避免直接访问Post.php时报错 if (empty($slug)) { echo "0 results"; exit; } // 原有SQL查询逻辑保留即可,注意用已经处理过的$slug变量,不要重复读$_GET $sql = "SELECT * FROM posts WHERE slug = '" . mysqli_real_escape_string($db, $slug) . "'"; $result = mysqli_query($db, $sql); // 后续你原来的输出逻辑完全不用动
注意事项
- 你原代码里第一行直接写
$slug = $_GET["slug"];没有做存在性校验,不带参数访问Post.php的时候会报PHP警告,上面的适配代码已经修复了这个问题。 - 重写规则里的文件、目录排除判断必须保留,不然站点的CSS、JS、图片,还有create_note.php、delete_post.php这类后台脚本都会被当成文章slug去查询,导致功能异常。
- 规则配置完成后,要把你模板里原来生成的文章链接从
Post.php?slug=xxx改成/xxx的格式,不然用户点旧链接还是会跳转到带参数的长URL。
内容的提问来源于stack exchange,提问作者Abbas Hassan
相关产品推荐
相关产品推荐

