htaccess外部重写/内部redirect

有两件事情,我想用.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参数和variables。 当我使用htaccestesting仪,它说它应该工作,但它不。 http://martinmelin.se/rewrite-rule-tester/

我该如何解决这个问题? 或者有没有更简单的方法来完成这个?

谢谢

试试这些规则:

 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]