nat*_*lia 31 php mysql .htaccess url-rewriting http-status-code-404
我有一个有故事的网站.我可以在多个类别中拥有多种类型的故事,例如:
可以使用以下网址访问这些故事:
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
噢,伙计,伙计!
您要求的并不简单,需要您拥有一台功能强大的计算机,但结果简直太棒了.
这是我建议做的事情:
ErrorDocument在vhost配置中具有重定向.我的是这样:ErrorDocument 404 /404.php;/404.php所有参数(错误的URL等等,转储$_SERVER以查看此内容).您必须测试URL中是否只有两个表达式,/即http://mysite.com/(expr1)/(expr2)/404 Php文件中).请参阅查询样品在这里./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)
sym*_*ean 18
除非您非常确定用户真正想要导航到的URL,否则使用重写/重定向到特定URL是一个非常糟糕的主意.
举个例子,假设您想要处理掉掉两个字母的每个案例,在URL的最后部分有17个字符,那就是17*16 = 272个组合,而有可能匹配多个'false'网址使用一个正则表达式,你将需要大量的重写规则.
更好的解决方案是,使用PHP实现404处理程序(因为您在q中包含了该标记),以生成(例如)前10个URL的列表,其路径与所请求的路径具有最短的levenstein距离,以及默认链接和支持文本.(有基于mysql的实现 - 尝试谷歌的URL).NB处理程序仍应返回404状态 - NB HTML内容必须大于最小长度才能抑制MSIE的"友好"错误消息.
如果您知道可能的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,(并且不能让他们改变链接),那么在这种情况下进行静态重写可能是值得的.