如何美丽的查询字符串url


How to beautiful query string URLs

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

是否有一种方法来完成这个改变使用mod_rewrite在Apache .htaccess文件,而不必改变所有的网站范围内的链接?例如,如果您点击一个链接到?page=about,它将永久重定向到/about/。

我所尝试的代码将成功地将/about/显示为?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

任何想法吗?非常感谢您的帮助。

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

/index.php?page=about
/about/

这意味着除非你对整个网站进行更改,否则你不会真正做出太大的改变,因为每个人都指向错误的URL。

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

话虽这么说,我认为有一些SEO,因为有一个重定向在所有的页面,没有人实际上指向更好的url直接。这可能不会给你想要的结果。另一种选择是使用您提供的那些正则表达式,并在所有视图中更改实际代码。这可能很容易,也可能很难,这取决于你如何制作你的链接。

好运。

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

  1. 你不想在你的网站工作方式上改变任何巨大的东西,但你想要漂亮的url(也许你正在使用一个框架强制页面被这样调用)。这意味着你需要同时支持丑陋的和漂亮的url,这意味着你需要mod_rewrite,这样两个版本都可以工作。
  2. 你的目标是为搜索引擎制作更好的url。这意味着您应该"鼓励"使用难看url的用户使用漂亮的url。在这种情况下,您可能应该清理站点上的旧url。如果没有,谷歌将继续抓取这些丑陋的url(因为这些将是它唯一看到的)。
  3. 你不能清理别人的url,所以你可能应该mod_redirect他们的链接到丑陋的url到你的好。这样谷歌就能很好地找到漂亮的url。这是我不确定的部分。mod_redirect和mod_rewrite会导致循环吗?我认为不是,但如果它这样做,那么只有#1和#2是可行的,你只需要生活在其他人的网站指向你的丑陋的url
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

这是我最后使用的。不确定所有这些标志是否都是必要的…但它使用前面的代码工作。我仍然需要改变网站范围内的所有链接(前端和后端),但我也应该把所有旧链接重定向,以防我错过一个或其他网站链接到旧页面。

我的意思是最好的方法是:

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