htaccess外部重写/内部重定向

时间:2014-01-18 22:19:40

标签: regex apache .htaccess mod-rewrite

我想用.htaccess文件实现两件事。 第一个是

www.hostname.com/index.php?question  -> www.hostname.com/question
www.hostname.com/index.php?myinfo  -> www.hostname.com/myinfo
www.hostname.com/index.php?notification  -> www.hostname.com/notification

所以我使用外部重写来重新表达URL,如下所示。

RewriteCond %{THE_REQUEST} /(index.php)\?([^&]+)\ HTTP
RewriteRule ^ /%2? [R=301,L]

现在上面的语句正确显示我想要的内容。问题是在满足条件时内部转换回来。条件是%{THE_REQUEST}等于“/”之后的任何字符。

RewriteCond %{REQUEST_URI} ^/(.*)$ [NC]
RewriteRule ^(.*)$ index.php?$1 [NC,L]

这样我的php代码就可以识别$_GET参数。在这里,即使满足条件,它也不会处理RewriteRule。

第二个问题是

www.hostname.com/index.php?category=spo  -> www.hostname.com/category/spo
www.hostname.com/index.php?category=ite  -> www.hostname.com/category/ite
www.hostname.com/index.php?category=gam  -> www.hostname.com/category/gam

使用外部重写完成转换:

RewriteCond %{THE_REQUEST} /(index)\?category=([^&]+)\ HTTP
RewriteRule ^ category/%2? [R=301,L]

同样,我想将URL中写入的内容转换回内部原始格式,因此我使用以下条件区分以前的情况,

RewriteCond %{REQUEST_URI} ^/category/(.*)$
RewriteRule ^category/(.*)/?$ index.php?category=$1 [NC,L]

我的php代码无法识别$_GET参数和变量。当我使用htacces测试仪时,它说应该可以工作,但事实并非如此。 http://martinmelin.se/rewrite-rule-tester/

如何解决此问题?或者有没有更简单的方法来实现这个目标?

谢谢

1 个答案:

答案 0 :(得分:0)

请尝试以下规则:

RewriteEngine On

RewriteCond %{THE_REQUEST} \s/index\.php\?category=([^&\s]+) [NC]
RewriteRule ^ /category/%1? [R=301,L]

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

RewriteCond %{THE_REQUEST} \s/index\.php\?([^&\s]+) [NC]
RewriteRule ^ /%1? [R=301,L]

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