2012-02-06 226 views
4

如果你去像这样的网址:http://stackoverflow.com/questions/9155602/地址栏将更新到http://stackoverflow.com/questions/9155602/redirect-existing-file-to-different-url-using-mod-rewrite。这不是用JavaScript完成的,也不是用硬刷新完成的,我最好的猜测是它使用mod_rewrite完成;然而,它如何知道没有服务器端处理与PHP文章的标题?如何重写SEO友好的网址,如stackoverflow

我刚刚更新我的网站使用SEO友好的网址,它曾经是/shows.php?id=review-1,现在它的/review/1/super-baseball-2020。在最后的文本实际上并没有真正的问题,当涉及到我的改写是:

RewriteCond %{REQUEST_FILENAME} !-f 
RewriteCond %{REQUEST_FILENAME} !-d 
RewriteRule ^([a-z0-9]+)/([0-9]+)/([a-z0-9-]+)?/?$ /shows.php?id=$1-$2 [L,NC] 

我现在要确保谷歌不会打我重复的内容,以及书签正确转发的路径如下:

RewriteCond %{THE_REQUEST} ^GET\s/shows\.php\? 
RewriteCond %{QUERY_STRING} (?:^|&)id=review-1(?:&|$) [NC] 
RewriteRule^/review/1/super-baseball-2020/? [R=301,L,NC] 
RewriteCond %{THE_REQUEST} ^GET\s/shows\.php\? 
RewriteCond %{QUERY_STRING} (?:^|&)id=review-2(?:&|$) [NC] 
RewriteRule^/review/2/aero-fighters-2/? [R=301,L,NC] 
RewriteCond %{THE_REQUEST} ^GET\s/shows\.php\? 
RewriteCond %{QUERY_STRING} (?:^|&)id=review-3(?:&|$) [NC] 
RewriteRule^/review/3/aero-fighters-3/? [R=301,L,NC] 
.... and so on .... 

该解决方案是非常短视的,是成千上万的行放入我的.htaccess。

+0

我怀疑这个功能是使用'mod_rewrite'完成的。会发生什么情况是,对stackoverflow.com/*anything*的任何请求都由相同的服务器端代码处理,然后解析该URL并*路由*请求代码以使用问题ID为页面提供内容。问题标题被服务器忽略,请尝试访问http://stackoverflow.com/questions/9168364/bouncing-fluffy-muffins – millimoose 2012-02-06 22:46:03

+1

通常mvc应用程序将路由所有输入的请求到相同的脚本(前端控制器),这将解析请求自己,并将操作委托给正确的控制器类。 – dqhendricks 2012-02-06 22:52:23

回答

3

它如何知道没有服务器端的文章标题 用php处理?

mod_rewrite只能做这么多。另外,你必须更新它太多。最好用脚本处理这些请求。创建.htaccess,类似于你做了什么:

<IfModule mod_rewrite.c> 
RewriteEngine On 
#RewriteBase/
RewriteCond %{REQUEST_FILENAME} !-f 
RewriteRule ^(.*)$ /index.php [QSA,L] 
</IfModule> 
index.php

然后,分裂REQUEST_URI解析出/review/1/,查看数据库的审查与1 id称号,通过它添加到友好的URI(slug)函数中,并将其附加到url,然后重定向。

2

我也为我们的节目创建了一个SEO友好的URL解决方案。 URL自然是/raido/episode.php?SeriesId=1 & EpisodeId = 123,但我也想/radio/1-123-live.htm,所以我的.htaccess看起来像这样:

RewriteRule^\ d {1,3} - \ d {1,4}(+)。html $进行episode.php弹头= $ 0

我然后让目标页面处理它

if ($Slug !== "") { 
    $lIds = explode("-", $Slug); 
    $SeriesId=$lId[0]; 
    $EpisodeId=$lIds[1]; 
} 

这也可以让你?继续接受现有链接,而不必拥有相同代码的两个版本。

0

您可能需要在应用程序本身中执行此操作,方法是根据所需位置的绝对URL检查URL,或者每次添加新的“页面”时按generating the mapping

3

对于重复的内容,您应该在头部有一个规范链接标记。规范链接标签会告诉谷歌当前页面与规范链接有相同内容的替代网址,并且该内容的主要网址是规范链接。这对分页内容,搜索等内容很有用,例如,同一页面可能有不同的网址。

<link rel="canonical" href="http://www.somedomain.com/mainurl" /> 
2

,如果我做了

curl -I http://stackoverflow.com/questions/9155602/ 

其实我得到一个硬重定向:

HTTP/1.1 301 Moved Permanently 
Cache-Control: public, max-age=60 
Content-Length: 0 
Content-Type: text/html 
Expires: Mon, 06 Feb 2012 22:43:27 GMT 
Last-Modified: Mon, 06 Feb 2012 22:42:27 GMT 
Location: /questions/9155602/redirect-existing-file-to-different-url-using-mod-rewrite 
Vary: * 
Date: Mon, 06 Feb 2012 22:42:27 GMT 

通常这些设置包含一个简短的.htaccess,迫使所有的请求要经过前端控制器,或者一个主要的index.php文件。这个文件检查$ _SERVER ['PATH_INFO']变量并决定要拉入和渲染哪些内容。

这是一个简单的.htaccess的例子(其实只是从一个香草WordPress的复制安装):

RewriteEngine On 
RewriteBase/
RewriteRule ^index\.php$ - [L] 
RewriteCond %{REQUEST_FILENAME} !-f 
RewriteCond %{REQUEST_FILENAME} !-d 
RewriteRule . /index.php [L] 

在这个例子中,与硬重定向,他们可以有一个“其他”中的index.php ,如果根据最后一条PATH_INFO找不到内容,则进行查找并重定向。

+0

当我尝试卷曲一个我知道使用301的网址时,它只是说200. http://www.defunctgames.com/shows.php?id=review-1。代码:'RewriteCond%{THE_REQUEST}^GET \ s/shows \ .php \? RewriteCond%{QUERY_STRING}(^ |&)id = review- [0-9] +(&| $)[NC] RewriteRule^/controllers/redirectseo.php? [R = 301,L,NC,QSA]' – 2012-02-07 04:40:17