.htaccess问题 - URL重写

时间:2010-07-28 21:24:18

标签: apache .htaccess mod-rewrite url-rewriting

我在.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”。所以我不明白这种行为。((

我会非常感谢任何建议。

2 个答案:

答案 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。

编辑:哦,我还通过使尾随斜杠可选来组合规则。