【问题标题】:Support with rewrite URL in patterns支持在模式中重写 URL
【发布时间】:2018-01-03 12:37:38
【问题描述】:

我有这种网址格式:

https://www.example.com/shows/my_personal_show_2.0_34565.htm

其中尾号是数据库引用,我需要重写为:

https://www.example.com/shows/my-personal-show-2.0-my-personal-show.htm

我们有数以千计的 Google 索引 URL,需要通过 in .htaccess 规则和 301 重定向对其进行重写,以使其在不严重损害 SERP 的情况下对 SEO 更加友好。

提前致谢。

【问题讨论】:

  • 你能再举一些例子吗?重写模式不明显。
  • 感谢您的观看,我的意思是我不明白我将如何使用正则表达式匹配模式进行拆分,因为不同的 URL 具有不同的长度和由下划线分隔的单词数。但都有尾随数据库参考,从数字 1 开始到 5 位数字,如 _32262.htm 我需要将这个不友好的 URL 重写为 SEO 友好的 URL。
  • 您正在使用任何服务器端语言吗?
  • 您好,脚本是 PHP。

标签: .htaccess


【解决方案1】:

以SO为例,URL格式如下:

https://stackoverflow.com/questions/48077576/support-with-rewrite-url-in-patterns

要制作一个对 SEO 友好的 URL,您可以将 URL 重写为:

https://www.example.com/shows/34565/my-personal-show-2.0

首先,您可以编写自己的路由器并将上述 URL 映射到实际存在的文件:

.htacccess

RewriteRule ^shows/([0-9]+)/(.+)$ /router.php?id=$1&slug=$2 [QSA,L]

$1 是正则表达式部分 ([0-9]+) 的反向引用,$2 是正则表达式部分 (.+) 的反向引用。

对于router.php,您可以检查给定的idslug 是否映射到现有的htm 文件

router.php

if (isset($_GET['id']) && isset($_GET['slug'])) {
    $file_path = 'shows/' . str_replace('-', '_', $_GET['slug']) . '_' . $_GET['id'] . '.htm';
    if (file_exists($file_path)) {
        readfile($file_path);
    }
    else {
        header("HTTP/1.0 404 Not Found");
    }
    exit;
}

最后一件事是您应该将 SEO 不友好的 URL 永久重定向到 SEO 友好的 URL。

.htaccess

RewriteCond %{REQUEST_FILENAME} -f
RewriteCond %{REQUEST_URI} ^/shows/(.+)\_([0-9]+)\.htm$
RewriteRule ^ /redirect.php?id=%2&slug=%1 [QSA,L]

redirect.php

if (isset($_GET['id']) && isset($_GET['slug'])) {
    $redirectURL = '/shows/' . intval($_GET['id']) . '/' . str_replace('_', '-', $_GET['slug']);
    header('location: ' . $redirectURL, true, 301);
    exit;
}

【讨论】:

  • 非常感谢您的回复。这就是我要找的东西!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-04-10
  • 1970-01-01
  • 2017-09-02
  • 2013-07-04
  • 1970-01-01
相关资源
最近更新 更多