mod_rewrite与其他$ _GET变量冲突
问题描述:
我正在使用mod_rewrite使我的URL变得干净。通过这样做:
RewriteRule ^([a-zA-Z0-9_-]+)/([a-zA-Z0-9_-]+)$ index.php?page=$1&sub=$2
RewriteRule ^([a-zA-Z0-9_-]+)/([a-zA-Z0-9_-]+)/$ index.php?page=$1&sub=$2
RewriteRule ^([a-zA-Z0-9_-]+)/([a-zA-Z0-9_-]+)/([0-9]+)$ index.php?page=$1&sub=$2&id=$3
RewriteRule ^([a-zA-Z0-9_-]+)/([a-zA-Z0-9_-]+)/([0-9]+)/$ index.php?page=$1&sub=$2&id=$3
RewriteRule ^([a-zA-Z0-9_-]+)/([a-zA-Z0-9_-]+)/([a-zA-Z0-9_-]+)$ index.php?page=$1&sub=$2&action=$3
RewriteRule ^([a-zA-Z0-9_-]+)/([a-zA-Z0-9_-]+)/([a-zA-Z0-9_-]+)/$ index.php?page=$1&sub=$2&action=$3
这很好地改变了一切从例如: website.com/index.php?page=user&sub=profile
到website.com/user/profile/
。
但是如果在配置文件后还有其他$_GET
变量会怎么样。因此,举例来说,如果用户要求: website.com/user/profile/?do=that&go=ahead
当我尝试打印$_GET['do']
和$_GET['go']
,他们返回空。
任何想法?
建议,让我的mod_rewrite代码更短,也欢迎:)
答
在这种情况下,你需要添加QSA flag。此外,我会说你的6条规则基本上都是一样的。您可以使用?
运算符将可选部分添加到正则表达式。例如,这些线路:
RewriteRule ^([a-zA-Z0-9_-]+)/([a-zA-Z0-9_-]+)$ index.php?page=$1&sub=$2
RewriteRule ^([a-zA-Z0-9_-]+)/([a-zA-Z0-9_-]+)/$ index.php?page=$1&sub=$2
...可以合并为:
RewriteRule ^([a-zA-Z0-9_-]+)/([a-zA-Z0-9_-]+)/?$ index.php?page=$1&sub=$2 [QSA]