2011-10-25 56 views
1

我有一个完整的网站建立在查询字符串的链接方案上(即?page = about或?page = individual & i = johndoe)。当然,回想起来,我们决定采用不同的(美化)方案,以便更加适合搜索引擎优化(即/ about/or/individual/johndoe /)。如何美丽的查询字符串的网址

有没有办法在Apache .htaccess文件上使用mod_rewrite来完成这种改变,而不必更改站点范围内的所有链接?例如,如果你点击一个链接到?page =关于它会永久地将你重定向到/ about /。

我试过的代码将成功显示/ about/as?page = about,但是,没有涉及重定向。说实话,我从来没有在mod_rewrite上做过任何工作(这有点吓人),所以我觉得我会走错方向。尽管如此,这是迄今为止我一直在使用的代码:

RewriteEngine On 
RewriteRule ^([a-zA-Z0-9_]+)$ /$1/ [R] 
RewriteRule ^([a-zA-Z0-9_]+)/$ /index.php?page=$1 

RewriteRule ^([a-zA-Z0-9_]+)/([a-zA-Z0-9_]+)$ /$1/$2/ [R] 
RewriteRule ^([a-zA-Z0-9_]+)/([a-zA-Z0-9_]+)/$ /index.php?page=$1&i=$2 
RewriteRule ^([a-zA-Z0-9_]+)/([a-zA-Z0-9_]+)/$ /index.php?page=$1&id=$2 
RewriteRule ^([a-zA-Z0-9_]+)/([a-zA-Z0-9_]+)/$ /index.php?page=$1&bctid=$2 
RewriteRule ^([a-zA-Z0-9_]+)/([a-zA-Z0-9_]+)/$ /index.php?page=$1&bclid=$2 

有什么想法?我非常感谢任何帮助。

+3

有匹配相同的模式是行不通的多个重写规则,是与案件在你的例子中最底层的4个重写规则,因为只有这些规则中的第一个会被apache选中。此外,你应该使用301重定向永久重定向。 –

回答

2

首先...重写将只适用于重写请求。其结果是你在你的问题中列出的更改将现在允许在两个方面要访问的页面:

/index.php?page=about 
/about/ 

这意味着,除非你整个网站的改变,你不能真正使很多,因为每个人的变化指向了错误的URL。

我认为,而不是你想使用mod_redirect,将用户重定向到新的形成的URL。我想你可以将这个新的URL映射回你网站实际期望的版本。我相信这是有效的,并不会导致循环。

这就是说,我认为有一些搜索引擎优化丁,因为所有网页都有重定向,而且没有人直接指向更好的网址。这可能不会给你你想要的结果。另一种选择是使用您提供的那些正则表达式,并实际上在所有视图中更改真实的代码。这可能很容易或很难,这取决于你如何制作链接。

祝你好运。

澄清

我读了你的问题,你想要几个不同的东西:

  1. 你不想改变什么巨大的方式您的网站,但你要很好的网址(也许你正在使用一个框架的力量页面被这样调用)。这意味着你需要支持丑陋和漂亮的网址,这意味着你需要mod_rewrite,这样两个版本都能正常工作。
  2. 您的目标是为搜索引擎制作更好的网址。这意味着你应该“鼓励”使用丑陋URL的用户来改用漂亮的网址。在这种情况下,你应该清理你网站上的旧网址。如果不是谷歌将继续爬行丑陋的网址(因为这是唯一的看到)。
  3. 你不能清理其他人的网址,所以你应该mod_redirect他们的链接到丑陋的网址到你的好。这样谷歌会很好地找到好的网址。 (这是我不确定的部分。mod_redirect和mod_rewrite会导致循环吗?我想不会,但如果是的话那么唯一的#1和#2是可行的,而且你只需要忍受别人的网站指向你的丑网址
+0

所以基本上你说除了重写之外还需要重定向?其次,我还应该浏览网站,并更改所有链接到新标准,因为它们无论如何都不会真正进入正确的页面。我是否也纠正过这个问题? – cereallarceny

0
RewriteEngine On 

RewriteRule ^([a-zA-Z0-9_]+)$ /$1/ [NC,R=301] 
RewriteRule ^([a-zA-Z0-9_]+)/$ /index.php?page=$1 

RewriteRule ^(artists)/([a-zA-Z0-9_]+)$ /artists/$2/ [NC,R=301] 
RewriteRule ^(artists)/([a-zA-Z0-9_]+)/$ /index.php?page=individual&i=$2 

RewriteRule ^(photos)/([a-zA-Z0-9_]+)$ /photos/$2/ [NC,R=301] 
RewriteRule ^(photos)/([a-zA-Z0-9_]+)/$ /index.php?page=photogallery&person=$2 

RewriteRule ^(post)/([a-zA-Z0-9_]+)$ /post/$2/ [NC,R=301] 
RewriteRule ^(post)/([a-zA-Z0-9_]+)/$ /index.php?page=post&id=$2 
RewriteRule ^(rss)/([a-zA-Z0-9_]+)$ /rss/$2/ [NC,R=301] 
RewriteRule ^(rss)/([a-zA-Z0-9_]+)/$ /index.php?page=post&rss=$2 
RewriteRule ^(search)/([a-zA-Z0-9_]+)$ /search/$2/ [NC,R=301] 
RewriteRule ^(search)/([a-zA-Z0-9_]+)/$ /index.php?page=post&q=$2 

RewriteRule ^(video)/([a-zA-Z0-9_]+)$ /video/$2/ [NC,R=301] 
RewriteRule ^(video)/([a-zA-Z0-9_]+)/$ /index.php?page=videogallery&bctid=$2 
RewriteRule ^(playlist)/([a-zA-Z0-9_]+)$ /playlist/$2/ [NC,R=301] 
RewriteRule ^(playlist)/([a-zA-Z0-9_]+)/$ /index.php?page=videogallery&bclid=$2 

这里是我结束了使用。不知道是否所有这些标志是必要的......但它使用以前的代码。我仍然需要更改站点上的所有链接(前端和后端),但是我也应该对所有旧链接进行重定向,以防我错过其他链接到旧页面的链接。

0

我的意思是最好的办法是如何做到这一点的是:

RewriteRule ^([a-zA-z0-9-]+)/?([a-zA-Z0-9/-]+)?$ index.php?page=$1&par=$2 

和PHP:

$page = $_GET["page"]; 
$parm = split("/",$_GET["par"]); 

// first par 
$parm[0]; 
相关问题