PHP中匹配URL的/page/1并重定向至主URL的正则规则实现问题
PHP分页URL重定向优化方案
需求明确
需要匹配分类分页URL(如/product-category/womens-jackets/page/1)中的/page/1片段,匹配成功后301永久重定向到对应主分类URL(如/product-category/womens-jackets),解决重复页面的SEO问题。
现有代码的问题
你之前的代码存在两个关键问题:
- 正则
/\/page\/[1]+\/?$/会误匹配/page/111这类无效分页,且未限定是分类页面下的分页,可能影响其他URL; preg_replace中的$1无意义,因为正则没有捕获组,无法正确截取主URL。
结合现有规则的实现方案
我们可以把你定义的分类正则和page1判断结合,实现精准匹配和重定向:
$root = 'https://your-domain.com'; // 替换为实际站点根域名 $uri = $_SERVER['REQUEST_URI']; // 1. 优先处理分类下的page1,精准匹配并重定向 if (preg_match('#^/product-category/(?<shop>[\w-]+)/page/1/?$#', $uri, $matches)) { $redirectUrl = "/product-category/{$matches['shop']}"; // 301永久重定向,传递SEO权重 header("HTTP/1.1 301 Moved Permanently"); header("Location: {$root}{$redirectUrl}"); exit(); } // 2. 处理非page1的分类分页 elseif (preg_match('#^/product-category/(?<shop>[\w-]+)/page/(?<page>\d+)/?$#', $uri, $matches)) { $page = (int)$matches['page']; if ($page > 1) { // 这里写你的分页逻辑,比如查询对应页的商品数据 echo "分类 {$matches['shop']} 第 {$page} 页内容"; } else { // 兜底:防止page=0等异常值,直接重定向到主分类页 header("HTTP/1.1 301 Moved Permanently"); header("Location: {$root}/product-category/{$matches['shop']}"); exit(); } } // 3. 处理主分类页(默认显示第1页内容) elseif (preg_match('#^/product-category/(?<shop>[\w-]+)/?$#', $uri, $matches)) { echo "分类 {$matches['shop']} 第 1 页内容"; } // 4. 其他URL处理(如404) else { header("HTTP/1.1 404 Not Found"); echo "页面不存在"; }
更优实现建议
- 提取正则为常量:方便统一维护,避免重复编写正则
define('REGEX_CATEGORY_PAGE1', '#^/product-category/(?<shop>[\w-]+)/page/1/?$#'); define('REGEX_CATEGORY_PAGINATED', '#^/product-category/(?<shop>[\w-]+)/page/(?<page>\d+)/?$#'); define('REGEX_CATEGORY_MAIN', '#^/product-category/(?<shop>[\w-]+)/?$#');
之后判断时直接使用常量即可,代码更整洁。
使用301重定向:一定要用
HTTP/1.1 301 Moved Permanently而不是默认的302,这样搜索引擎会把原页面的权重转移到新页面,避免重复内容被降权。严格校验分页参数:把
$page转为整数,防止SQL注入或非法参数攻击。
内容的提问来源于stack exchange,提问作者Amir
相关产品推荐
相关产品推荐

