使用htaccess修复拼写错误的网址

时间:2013-12-18 08:12:04

标签: html apache .htaccess url

所以我的网站有一个非常简单的问题(至少我认为这样做)。我需要能够将任何拼错的URL重定向到正确的URL。如果我向你们解释它比描述它更容易。

例如,让我们拿这个网址。

http://www.tomshardware.com/reviews/radeon-r9-290x-hawaii-review,3650.html

现在,无论网址拼写如何,该网址都会将您带到该文章的正确页面。假设您不小心将字母,数字或单词放入该URL中,如下所示:

http://www.tomshardware.com/reviews/radeon-r9-290x-TEST-TEST-hawaii-review,3650.html

该网址仍然会将您带到正确的文章并将其自行修复为正确的网址。您可以向该网址添加任何内容,无论您不小心输入内容,它都会将您带到正确的文章中。

所以我的问题是如何在htaccess中执行此操作?这是我目前的htaccess文件

# Secure htaccess file
<files .htaccess>
order allow,deny
deny from all
</files>

AddHandler application/x-httpd-php5 .html .htm
AddType application/x-httpd-php .html .htm .php
AddHandler cgi-script .pl .cgi
Options ALL -Indexes -Multiviews +ExecCGI +FollowSymLinks

# Do not remove this line, otherwise mod_rewrite rules will stop working
RewriteBase /

RewriteEngine on
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME}\.html -f
RewriteRule ^(.*)$ $1.html

#Redirect Non-WWW to WWW
RewriteCond %{HTTP_HOST} !^www\.
RewriteRule ^(.*)$ http://www.%{HTTP_HOST}/$1 [R=301,L]

RewriteCond %{REQUEST_URI} /index\.html?$ [NC]
RewriteRule ^(.*)index\.html?$ "/$1" [NC,R=301,NE,L]

2 个答案:

答案 0 :(得分:2)

你可能不会这样做。

正如您所看到的,网址上的文字完全无关紧要,只是为了创建可读和索引友好(SEO)网址。这些词被称为“slu”,见http://en.wikipedia.org/wiki/Clean_URL#Slug 如果您修改最后一部分,3650它将破坏URL,因为这是唯一的标识符,通常对应于数据库中的唯一ID。

假设所提到的网站如何以及为何这样做: 该站点使用独立的路由组件(例如,来自Symfony PHP框架的路由:http://symfony.com/components/Routing),整个Web框架或一切都是手工编写的。根据语言,它可能是PHP的ZEND,Symfony等,Asp.net的MVC或任何其他语言。

在所有情况下,在提供原始内容之前都会对网址进行某种过滤。 路由解析URL,检索唯一ID,获取数据集并再次创建绝对URL。 然后,它将新生成的路线与您输入的路线进行比较。 如果它们与框架不匹配,则发出一个30x的http状态,并将您重定向到新的URL。 这样做的目的是在slug标签发生变化时或者出于任何原因SEO友好的url布局发生变化时保持链接健全性。 重定向就在那里,以便下次搜索引擎访问页面并更新它的索引时更新旧的URL。 想象一下你在slu in中的某个地方有一个错字,或者你忘了提起Radeon而你想避免在DB中永远破坏或错误。 所以你需要修复它,但同时你要避免破坏搜索索引的旧网址,这些搜索索引尚未使用新标记或已添加书签的用户重新访问您的网站。

重定向后,它会再次比较网址,并在匹配后提供内容。

这里很可能是数据库查找,你不能单独使用htaccess,因为你不知道网址的正确性。

答案 1 :(得分:1)

您可以将所有文章页面内部重定向到php程序,它会将参数与最佳页面匹配以显示

-- .htaccess --
RewriteEngine on
RewriteRule ^article/(.*).html$     /article.php?url=$1     [L]

-- php --
read article selection criteria
$article_url=$_GET['url'];
Search through database or files and show the article