我在.htaccess中遇到了网址重写问题 . 这是.htaccess文件:
RewriteEngine On
RewriteBase /community/
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^view-all-results$ forums/index.php?view=view-all-results [R=302]
RewriteRule ^view-all-results/$ forums/index.php?view=view-all-results [R=302]
我需要重写网址,如“ /community/view-all-results?u=2
" to " community/forums/index.php?view=view-all-results&u=2
". But according to the above rule I'll get " community/forums/index.php?view=view-all-results
” .
我试图将RewriteRule改为
RewriteRule ^view-all-results?(.*)$ forums/index.php?view=view-all-results&$1 [R=302]
但它不能正常工作 . 它仍然将URL重写为“ community/forums/index.php?view=view-all-results
” .
当我改变规则(代替*)时:
RewriteRule ^view-all-results?(.+)$ forums/index.php?view=view-all-results&$1 [R=302]
我有像“ community/forums/index.php?view=view-all-results&s
”这样的网址 . 所以我不明白这种行为 . ((
任何建议我都将非常感激 .
2 回答
魔术标志是in the docs: [QSA],它会将原始查询字符串添加到您的网址 .
正常匹配仅针对路径进行,而不是再次进行查询,您可以在魔术变量
%{QUERY_STRING}
中找到 . 匹配此变量可以在RewriteCond
条件下完成 . 您也可以将此变量附加到生成的URL,但QSA
在这里是无限的用户 .尝试一下......
基本上,RewriteRule的前半部分与QUERY_STRING不匹配,因此您的第二个示例将永远不会与它匹配 . 你的第一个代码缺少的主要是QSA标志,它告诉它传递它接收的QUERY_STRING以及新创建的QUERY_STRING . 我还删除了R = 302,因为我假设您不希望更改URL .
编辑:哦,我还通过使尾随斜杠可选来组合规则 .