【问题标题】:Use htaccess to fix misspelled urls使用 htaccess 修复拼写错误的 url
【发布时间】:2014-01-06 07:34:17
【问题描述】:

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

例如,我们以这个 url 为例。

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

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

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

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

所以我的问题是如何在 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]

【问题讨论】:

  • 我该怎么做呢?我真的不知道从哪里开始。

标签: html apache .htaccess url


【解决方案1】:

你可能不能那样做。

如您所见,url 上的文本完全不相关,仅用于创建可读和索引友好 (SEO) 的 url。这些词被称为“蛞蝓”,见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 进行某种过滤。 路由解析 url,检索唯一 ID,获取数据集并从中再次创建绝对 URL。 然后它将新生成的路线与您输入的路线进行比较。 如果它们不匹配,框架会发出 30x 的 http 状态并将您重定向到新的 url。 这样做的目的是在 slug 标签发生更改或出于任何原因对 SEO 友好的 url 布局发生更改时保持链接的完整性。 重定向就在那里,因此在下次搜索引擎访问该页面并更新其索引时,旧式 url 会被更新。 想象一下,您在 slug 中的某个地方有错字,或者您忘记提及 Radeon,并且您希望避免它在数据库中永远损坏或错误。 因此,您需要修复它,但同时又要避免破坏尚未使用新的 slug 或已为其添加书签的用户重新访问您的网站的搜索索引的旧网址。

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

这里很可能会进行数据库查找,而仅使用 htaccess 无法正确执行此操作,因为您不了解此处 url 的正确性。

【讨论】:

  • 感谢您的详细回复。它看起来对我来说太复杂太复杂了,无法在我的网站上实现,所以我想我不会打扰它。
【解决方案2】:

您可以将所有文章页面内部重定向到一个 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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-10-19
    • 1970-01-01
    • 2016-05-14
    • 2018-09-28
    • 2011-03-29
    • 2012-03-09
    • 2016-11-30
    相关资源
    最近更新 更多