我想要使用.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/我该如何解决这个问题?还是有更简单的方法来完成此任务?
谢谢
最佳答案
尝试以下规则:
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]