如何使用mod_rewrite从旧的PHP脚本重定向到新的PHP脚本

时间:2013-08-20 12:19:49

标签: regex apache .htaccess mod-rewrite seo

这是我在这里的第一个请求,希望我不会让任何人感到不安。

这是我的故事:

我已经遍布这个地方寻找解决方案而无法找到解决方案。这里希望有人可以提供一些意见。

我基本上设法使用Apache的 mod_rewrite 为我的网站创建了SEO友好的网址。

E.g。旧路径 www.hostname / index1.php?session = user 现在被重写为 www.hostname / user ,这会产生一个SEO友好的URL地址。

但是,旧路径仍然有效。我需要以某种方式将所有传入的旧 index1.php 请求重定向到较新的URL,即SEO友好的URL,以便搜索引擎将链接流行度转移到新的URL。我相信我可能有一个无限循环重定向,这就是它无法正常工作的原因。

到目前为止我的代码:

Options +FollowSymLinks
RewriteEngine On
RewriteBase / 

## Redirect still valid old links to SEO friendly ones
RewriteRule ^/?index1\.php\?session=user$ /user [R=301]

## Catch the above and rewrite the URL 
RewriteRule ^/?user/?$ /index1.php?session=user [QSA,L]

解析 htaccess 文件时,上述规则永远不会 hit

我觉得我可能会在这里进行某种重定向循环,所以我考虑将 index1.php 文件重命名为 index2.php 并创建类似于:

## Redirect still valid old links to SEO friendly ones
RewriteRule ^/?index1\.php\?session=user$ /user [R=301]

## Catch the above and rewrite the URL 
RewriteRule ^/?user/?$ /index2.php?session=user [QSA,L]

然而,这也失败了。

最好的方法是什么?我在这里做错了什么?

谢谢!

2 个答案:

答案 0 :(得分:1)

将您的.htaccess规则更新为

Options +FollowSymLinks
RewriteEngine On
RewriteBase / 

## Redirect still valid old links to SEO friendly ones
RewriteCond %{QUERY_STRING} !no-redir [NC]
RewriteCond %{QUERY_STRING} session=user [NC]
RewriteRule ^/?index1\.php$ /user? [R=301,NC,L]

## Catch the above and rewrite the URL 
RewriteRule ^/?user/?$ /index1.php?session=user&no-redir [QSA,NC,L]

答案 1 :(得分:0)

您无法在重写规则中与查询字符串(?之后的所有内容)匹配,因此您无法与session=部分匹配。您也不能简单地匹配%{QUERY_STRING} var,因为当您将SEO友好URL重写为具有查询字符串的URL时,由其他规则填充。所以你需要匹配实际的请求:

RewriteCond %{THE_REQUEST} ^(GET|HEAD)\ /index1\.php\?session=([^&]+)&?([^\ ]*)
RewriteRule ^ /%2?%3 [L,R=301]