使用mod_rewrite将301重定向到vars到新的干净URL

时间:2012-02-08 03:11:04

标签: regex apache .htaccess mod-rewrite get

更新:底部的解决方案。

我最近使用index.php?p=page_name&o=temporary_override这样的设置切换到/page_name/temporary_override等干净的网址。临时覆盖只是因为我可以在构建时看到网站更改的结果。

我目前将mod_rewrite设置为:

RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)$ index.php?GHPAGE=$1 [L,QSA]

将捕获“子目录”,然后PHP解析GHPAGE $ _GET var中的URL。我想要的是设置301重定向,以便任何人使用index.php?p = something& o = something_else将被重定向到/ something / something_else。知道我怎么能做到这一点? p& o可能以任何顺序出现,其中一个或另一个可能不存在。

编辑:好的,在@ Jon-Lin,@ dambrisco和@anubhava的帮助下,我已经接近了。我的.htaccess文件现在看起来像:

RewriteEngine On
#Base Directory
RewriteBase /test/

#if 2 GET Vars
RewriteCond %{THE_REQUEST} ^([A-Z]{3,9})\ \/([^\/]+\/)*(index\.php)?\?[op]=([^&]+)&[op]=(.+)\ HTTP\/
RewriteRule ^index\.php$ /%4/%5 [R=301,L]
#if 1 GET Var
RewriteCond %{THE_REQUEST} ^([A-Z]{3,9})\ \/([^\/]+\/)*(index\.php)?\?[op]=(.+)\ HTTP\/
RewriteRule ^index\.php$ /%4 [R=301,L]
#Remove index.php
RewriteCond %{THE_REQUEST} ^([A-Z]{3,9})\ \/([^\/]+\/)*index\.php\ HTTP\/
RewriteRule ^index\.php$ / [R=301,L]

RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)$ index.php?GHPAGE=$1 [L,QSA]

它现在正在重定向,但并不是它需要去的地方。 root/test/index.php?p=test&o=override现在重定向到root/test/override?p=test&o=override。更近,但我无法弄清楚如何摆脱正在添加到URL的GET变量,或者为什么它重定向到根目录而不是重定向到RewriteBase目录。

编辑:

它现在正确地重定向,但由于某种原因,它正在从等式中删除/ test / RewriteBase文件夹。 http://www.domain.com/test/index.php?p=page1&o=operation被重定向到http://www.domain.com/page1/operation。新的.htaccess文件如下:

RewriteEngine On

RewriteBase /test/

#if 2 GET Vars
RewriteCond %{THE_REQUEST} ^([A-Z]{3,9})\ /([^/]+/)*(index\.php)?\?[op]=([^&]+)&[op]=(.+)\ HTTP\/
RewriteRule ^ /%4/%5? [R=301,L]

#if 1 GET Var
RewriteCond %{THE_REQUEST} ^([A-Z]{3,9})\ /([^/]+/)*(index\.php)?\?[op]=(.+)\ HTTP\/
RewriteRule ^ /%4? [R=301,L]

#if index.php
RewriteCond %{THE_REQUEST} ^([A-Z]{3,9})\ \/([^\/]+\/)*index\.php\ HTTP\/
RewriteRule ^index\.php$ /$ [L,R=301]

RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)$ index.php?GHPAGE=$1 [L,QSA]

谢谢大家。问题已经解决了。最终.htaccess在下面供参考。

RewriteEngine On

RewriteBase /test/

#if 2 GET Vars
RewriteCond %{THE_REQUEST} ^([A-Z]{3,9})\ /([^/]+/)*(index\.php)?\?[op]=([^&]+)&[op]=(.+)\ HTTP\/
RewriteRule ^ %4/%5? [R=301,L]

#if 1 GET Var
RewriteCond %{THE_REQUEST} ^([A-Z]{3,9})\ /([^/]+/)*(index\.php)?\?[op]=(.+)\ HTTP\/
RewriteRule ^ %4? [R=301,L]

#if index.php
RewriteCond %{THE_REQUEST} ^([A-Z]{3,9})\ \/([^\/]+\/)*index\.php\ HTTP\/
RewriteRule ^index\.php$ ? [L,R=301]

RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)$ index.php?GHPAGE=$1 [L,QSA]

3 个答案:

答案 0 :(得分:0)

在你的htaccess中添加它:

RewriteCond %{THE_REQUEST} ^([A-Z]{3,9})\ /index\.php\?p=([^&]+)&o=(.+)\ HTTP
RewriteRule index.php /%2/%3 [R=301,L]

如果您想要覆盖没有“temporary_override”的情况,请同时添加:

RewriteCond %{THE_REQUEST} ^([A-Z]{3,9})\ /index\.php\?p=(.+)\ HTTP
RewriteRule index.php /%2 [R=301,L]

  

更接近,但我无法弄清楚如何摆脱正在添加到URL的GET变量或者为什么它重定向到根目录而不是重定向到RewriteBase目录

?的末尾添加/%4/%5以删除查询字符串。并从/中删除前导/%4/%5,以防止重写到根目录。因此,例如,您的一条规则应如下所示:

RewriteCond %{THE_REQUEST} ^([A-Z]{3,9})\ \/([^\/]+\/)*(index\.php)?\?[op]=([^&]+)&[op]=(.+)\ HTTP\/
RewriteRule ^index\.php$ %4/%5? [R=301,L]

答案 1 :(得分:0)

您将要使用以下内容:

RewriteRule ^([^/]+)/?$ index.php?p=$1 [L,QSA]
RewriteRule ^([^/]+)/([^/]+)/?$ index.php?p=$1&o=$2 [L,QSA]

这样,example.com/page_name内部传递给index.php?p=page_nameexample.com/page_name/operation传递给index.php?p=page_name&o=operation。 Jon Lin的回答似乎正好相反,我昨晚没有注意到。

除了避免与你可能拥有的其他规则发生冲突外,不应该有任何RewriteConds,只是为了澄清。

答案 2 :(得分:0)

更改2条RewriteRule行应以?结尾,如下所示:

#if 2 GET Vars
RewriteCond %{THE_REQUEST} ^([A-Z]{3,9})\ /([^/]+/)*(index\.php)?\?[op]=([^&]+)&[op]=(.+)\ HTTP\/
RewriteRule ^ /%4/%5? [R=301,L]

#if 1 GET Var
RewriteCond %{THE_REQUEST} ^([A-Z]{3,9})\ /([^/]+/)*(index\.php)?\?[op]=(.+)\ HTTP\/
RewriteRule ^ /%4? [R=301,L]