mod_rewrite在显示旧URL时究竟是如何工作的

时间:2014-01-13 22:02:25

标签: php regex .htaccess url mod-rewrite

我使用mod_rewrite将http://mywebsite.com/?page=2更改为http://mywebsite.com/page/2,使用以下代码:

    RewriteEngine On
    RewriteRule ^page/([^/]*)\.php$ /?page=$1 [L]

但是当我输入旧网址时,http://mywebsite.com/?page=2页面仍会显示,网址也不会更改为静态网页。 mod-rewrite是否意味着重定向用户,或者只是在输入时让动态网址上的所有内容都显示在静态网址上?如果是这样,我如何将转到旧动态网址的任何用户http://mywebsite.com/?page=2重定向到新的静态网址http://mywebsite.com/page/2?加上谷歌仍旧索引旧网址?

这是我完整的.htaccess文件:

    RewriteEngine On
    RewriteCond %{REQUEST_FILENAME} !-f
    RewriteRule ^([^\.]+)$ $1.php [NC,L]

    # external redirect from actual URL to pretty one
    RewriteCond \s/+\?page=([^\s&]+) [NC]
    RewriteRule ^ /page/%1? [R=301,L]

    # existing rule
    RewriteRule ^page/([^/]+)/?$ /?page=$1 [L,QSA]

2 个答案:

答案 0 :(得分:2)

像这样拥有完整的.htaccess:

RewriteEngine On

# external redirect from actual URL to pretty one
RewriteCond %{THE_REQUEST} \s/+\?page=([^\s&]+) [NC]
RewriteRule ^ /page/%1? [R=301,L]

# existing rule
RewriteRule ^page/([^/]+)/?$ /?page=$1 [L,QSA]

RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^([^\.]+)$ $1.php [L]

答案 1 :(得分:0)

mod_rewrite一定不会将访问者重定向到新的花哨网址,但会确保访问新网址的任何人仍然可以访问它,就像使用旧网址一样

我相信你可以用mod_substitute来达到类似的效果,但这不是我建议你现在做的事情。

如果可以,请手动更改链接以反映新的更改,或者使用可以解析链接的功能,例如

http://mywebsite.com/?page=2 to http://mywebsite.com/page/2

,例如

function fancyuri($url){
    //blah blah, strip out ? and change all occurence of equality sign = to forward slash
    //do some other tricks
    //return formatted links 
}

然后将您的链接作为参数传递给该函数并让它返回您的好网址,在这种情况下,即使您不再需要它,您也可以删除该函数中的格式代码并仍然拥有原始网址返回。