RewriteRule - 更改链接的中间位置

时间:2014-04-22 16:55:00

标签: php .htaccess mod-rewrite

我将网站的 / news / 部分移至 / about / news / 。现在我需要将旧链接重定向到已移动的页面。我尝试在.htaccess中使用RewriteRule,但它似乎不起作用:

RewriteEngine on
RewriteBase /

ErrorDocument 403 /403.php
ErrorDocument 404 /404.php
ErrorDocument 500 /500.php

RewriteRule ^$ inner.php?pathstring=/main/
RewriteRule ^(.+str=.*)$ inner.php?path=$1 [L]
RewriteRule ^([^\.]+)$ inner.php?path=$1 [QSA]

RewriteRule ^/news/(.*)$ about/news/$1 [R,L]

我在这里发布了我的整个.htacces,因为它是由现在不可用的其他人编写的,并且在php中是一个菜鸟,我有些担心它会影响我的attemts以某种方式重定向。

2 个答案:

答案 0 :(得分:1)

你的问题是你的第三个RewriteRule:

RewriteRule ^([^\.]+)$ inner.php?path=$1 [QSA]

尸检:

  • ^ - 字符串必须以下一场比赛开始
  • ([^\.]+) - 匹配任何非.的字符(您需要在正则表达式中.转义为“任意字符”)1到无穷大时间(这是+
  • $ - 字符串必须以上一场比赛结束

..因此,只有当网址中没有.时,您在底部的重定向才有效,例如。 /news/blabla/mysite.html

如何解决?只需将其移到其他规则之上,以便首先尝试匹配它。如果您的更改是永久性的,您还应该将R更改为R=301,以确保它发送301 Moved Permanently而不是302 Found(不会被缓存)。< / p>

RewriteRule ^/news/(.*)$ about/news/$1 [R=301,L]
RewriteRule ^$ inner.php?pathstring=/main/
RewriteRule ^(.+str=.*)$ inner.php?path=$1 [L]
RewriteRule ^([^\.]+)$ inner.php?path=$1 [QSA]

答案 1 :(得分:0)

试试这段代码:

RewriteEngine On

RewriteRule ^(news(?:/.*)?)$ /about/$1 [R=301,L,NC]
RewriteRule ^$ inner.php?pathstring=/main/ [L,QSA]
RewriteRule ^(.+?str=.*)$ inner.php?path=$1 [L,QSA,NC]
RewriteRule ^([^.]+)$ inner.php?path=$1 [L,QSA]