我在.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
”等网址重写为“community/forums/index.php?view=view-all-results&u=2
”。
但根据上述规则,我会得到“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
”。所以我不明白这种行为。((
我会非常感谢任何建议。
答案 0 :(得分:2)
魔术旗是in the docs: [QSA]
,它会将原始查询字符串添加到您的网址。
正常匹配仅针对路径进行,而不是再次进行查询,您可以在魔术变量%{QUERY_STRING}
中找到。匹配此变量可以在RewriteCond
条件下完成。您还可以将此变量附加到生成的网址,但QSA
在此处的用户非常友好。
答案 1 :(得分:2)
试一试......
RewriteEngine On
RewriteBase /community/
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^view-all-results/?$ forums/index.php?view=view-all-results [QSA]
基本上RewriteRule的前半部分与QUERY_STRING不匹配,所以你的第二个示例永远不会与它匹配。你的第一个代码缺少的主要是QSA标志,它告诉它传递它接收的QUERY_STRING以及新创建的QUERY_STRING。我还删除了R = 302,因为我假设您不希望更改URL。
编辑:哦,我还通过使尾随斜杠可选来组合规则。