如何美丽的查询字符串URL

时间:2011-10-25 21:17:29

标签: php apache url mod-rewrite query-string

我有一个基于查询字符串链接方案的整个网站(即?page = about或?page = individual& i = johndoe)。当然,回想起来我们决定采用不同的(美化的)方案,以便更加SEO友好(即/ about /或/ individual / johndoe /)。

有没有办法在Apache .htaccess文件上使用mod_rewrite完成此更改,而无需在全站点更改所有链接?例如,如果您点击指向?page = about的链接,它会永久地将您重定向到/ 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 个答案:

答案 0 :(得分:2)

首先......重写仅适用于重写请求。因此,您的问题中列出的更改现在将允许以两种方式访问​​页面:

/index.php?page=about
/about/

这意味着,除非您在整个网站中进行更改,否则您将无法进行太多更改,因为每个人都指向错误的网址。

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

据说,我认为有一些搜索引擎优化,因为所有网页都有重定向,没有人直接指向更好的网址。这可能不会给你想要的结果。另一种选择是使用您提供的正则表达式,并实际在所有视图中进行实际代码更改。根据您的链接方式,这可能很容易或很难。

祝你好运。

<强>澄清

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

  1. 您不希望更改网站工作方式的任何内容,但您想要很好的URL(也许您正在使用框架强制页面被调用)。这意味着您需要同时支持丑陋和友好的URL,这意味着您需要mod_rewrite以便两个版本都能正常工作。
  2. 您的目标是为搜索引擎制作更好的网址。这意味着您应该“鼓励”使用丑陋URL的用户改为使用漂亮的URL。在这种情况下,您应该清理您网站上的旧网址。如果不是谷歌将继续爬行丑陋的网址(因为这将是它看到的唯一的。)
  3. 您无法清理其他人的网址,因此您可能应该将他们的丑陋网址链接mod_redirect到您的网址。这样谷歌会很好地找到漂亮的网址。 (这是我不确定的部分.mod_redirect和mod_rewrite会导致循环吗?我想不会,但如果确实如此,那么只有#1和#2是可行的,你只需要和其他人一起生活人们的网站指向你丑陋的网址

答案 1 :(得分: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

这是我最终使用的内容。不确定是否所有这些标志都是必要的......但它使用前面的代码。我仍然需要在整个网站(前端和后端)更改所有链接,但我也应该为所有旧链接添加重定向,如果我错过了一个或者其他网站链接到旧页面。

答案 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];