将404重定向到类似的网址

nat*_*lia 31 php mysql .htaccess url-rewriting http-status-code-404

我有一个有故事的网站.我可以在多个类别中拥有多种类型的故事,例如:

  • 孩子
  • 浪漫
  • 科幻
  • 行动
  • thriler
  • 任务

可以使用以下网址访问这些故事:

www.example.com/action/story-name-action/
www.example.com/romance/story-name-romance/
Run Code Online (Sandbox Code Playgroud)

第一个参数(动作)和第二个(故事名称动作)使用规则重定向.htaccess.这部分工作正常.

最近,我从不同的网站得到了几十个404,这就是我想要做的但我不知道如何:

如果有人输入,例如:/action/story-nme-ction,我想重定向到:action/story-name-action/

有没有一种有效的方法来实现它?

Oli*_*ons 37

噢,伙计,伙计!

您要求的并不简单,需要您拥有一台功能强大的计算机,但结果简直太棒了.

这是我建议做的事情:

  • 对于404正确处理,您ErrorDocument在vhost配置中具有重定向.我的是这样:ErrorDocument 404 /404.php;
  • 拥有404时,Apache将调用/404.php所有参数(错误的URL等等,转储$_SERVER以查看此内容).您必须测试URL中是否只有两个表达式,/http://mysite.com/(expr1)/(expr2)/
  • 如果没有,那么做一个经典的404.
  • 如果是,则使用MySQL 进行SOUNDEX搜索(在您的404 Php文件中).请参阅查询样品在这里.
  • 然后,在这个"特殊"的404案例中,做一个像google那样的建议,即:"你的意思是/action/story-name-action/?如果是的话,点击链接".

这是一项艰苦的工作,但它既有趣又能展示你的技巧.很少有网站这样做(我实际上只知道谷歌).

这是我法语表上的一个演示,它可以让你概述它的工作原理:

mysql> SELECT * FROM job WHERE
SOUNDEX( description ) LIKE SOUNDEX('Machiniste cinéma');
+-------+--------------------+
| id    | description        |
+-------+--------------------+
| 14018 | Machiniste cinéma  |
+-------+--------------------+
1 row in set (0.06 sec)

mysql> SELECT * FROM job WHERE
SOUNDEX( description ) LIKE SOUNDEX('Mchiniste cinéma');
+-------+--------------------+
| id    | description        |
+-------+--------------------+
| 14018 | Machiniste cinéma  |
+-------+--------------------+
1 row in set (0.06 sec)

mysql> SELECT * FROM job WHERE
SOUNDEX( description ) LIKE SOUNDEX('Machnste cinema');
+-------+--------------------+
| id    | description        |
+-------+--------------------+
| 14018 | Machiniste cinéma  |
+-------+--------------------+
1 row in set (0.06 sec)

mysql> 
Run Code Online (Sandbox Code Playgroud)

  • 你是对的.我刚才提出了唯一一个与纳塔利亚想要的最接近的解决方案.而她想要的几乎是不可能的. (2认同)

sym*_*ean 18

除非您非常确定用户真正想要导航到的URL,否则使用重写/重定向到特定URL是一个非常糟糕的主意.

举个例子,假设您想要处理掉掉两个字母的每个案例,在URL的最后部分有17个字符,那就是17*16 = 272个组合,而有可能匹配多个'false'网址使用一个正则表达式,你将需要大量的重写规则.

更好的解决方案是,使用PHP实现404处理程序(因为您在q中包含了该标记),以生成(例如)前10个URL的列表,其路径与所请求的路径具有最短的levenstein距离,以及默认链接和支持文本.(有基于mysql的实现 - 尝试谷歌的URL).NB处理程序仍应返回404状态 - NB HTML内容必须大于最小长度才能抑制MSIE的"友好"错误消息.


Lei*_*igh 7

如果您知道可能的URL是什么,可以使用:

levenshtein($givenURL, $possibleURL)

来自PHP文档的示例,为简洁起见删除了注释:

$input = 'carrrot';

$words  = array('apple','pineapple','banana','orange',
                'radish','carrot','pea','bean','potato');

$shortest = -1;

foreach ($words as $word) {
    $lev = levenshtein($input, $word);
    if ($lev == 0) {
        $closest = $word;
        $shortest = 0;
        break;
    }
    if ($lev <= $shortest || $shortest < 0) {
        $closest  = $word;
        $shortest = $lev;
    }
}

echo $shortest == 0 ? "Exact match found: $closest\n" : "Did you mean: $closest?\n";
Run Code Online (Sandbox Code Playgroud)

输出:

输入字:carrrot
您的意思是:胡萝卜?

如果你认为人们可能已经遗漏了一封信或者放了一个额外的信,那就很好了,但是当人们真的不知道如何拼写单词并想出一些有创意的东西时,它可能会失败!

如果您更喜欢这soundex()条路线,请查看该metaphone()功能.

我喜欢和它metaphone()一起使用的想法,levenshtein() 或者similar_text()因为它返回了这个单词的语音表示,你仍然希望看到它与你原来的相似之处.

例子:

metaphone('name') = NM
metaphone('naaaaaameeeeeeee') = NM
metaphone('naiym') = NM
metaphone('naiyem') = NYM
Run Code Online (Sandbox Code Playgroud)

虽然很多拼写错误会返回相同的匹配,但最后一个例子显示你真的还想找到最接近的匹配 levenshtein()

为了提高效率,如果你使用一个不同的404文件,其中重写试图匹配这个模式并且失败,那么比你用于网站的其余部分,它真的不应该是一个巨大的开销.

如果你从同一个引用者那里得到相同的404,(并且不能让他们改变链接),那么在这种情况下进行静态重写可能是值得的.