我有一个基于查询字符串链接方案的整个网站(即?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
有什么想法?我非常感谢任何帮助。
答案 0 :(得分:2)
首先......重写仅适用于重写请求。因此,您的问题中列出的更改现在将允许以两种方式访问页面:
/index.php?page=about
/about/
这意味着,除非您在整个网站中进行更改,否则您将无法进行太多更改,因为每个人都指向错误的网址。
我认为你想使用mod_redirect将用户重定向到新形成的URL。我认为您可以将新网址映射回您的网站实际预期的版本。我相信这有效,并且不会导致循环。
据说,我认为有一些搜索引擎优化,因为所有网页都有重定向,没有人直接指向更好的网址。这可能不会给你想要的结果。另一种选择是使用您提供的正则表达式,并实际在所有视图中进行实际代码更改。根据您的链接方式,这可能很容易或很难。
祝你好运。<强>澄清强>
我读了你的问题,因为你想要几件不同的东西:
答案 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];