.htaccess中的QUERY_STRING重定向时

时间:2010-10-02 17:27:30

标签: .htaccess mod-rewrite redirect

如何允许访问者使用此链接(www.example.com/news?id=34)以查看(www.example.com/index.php?page=news&id=34)

现在我隐藏了我的PHP文件的扩展名,以使链接看起来不错。当访问者访问(www.example.com/news)时,他们可以看到该页面(www.example.com/index.php?page=news)。但是,当他们访问(www.example.com/news?id=12)时,他们会收到404错误。

此时,PHP无法识别id参数。这是我目前在.htaccess文件中的内容

Options +FollowSymlinks
RewriteEngine on

# catch request with no querystring like /Home
RewriteCond %{QUERY_STRING} ^$
RewriteRule ^([^/]+)$ /index.php?page=$1 [L]

# make other requests with a non-empty query string go to /index.php?id=XXXXX
RewriteCond %{QUERY_STRING} ^.*$
RewriteRule ^$ /index.php?id=$1 [QSA,L]

2 个答案:

答案 0 :(得分:0)

第一条规则的条件失败,因为查询不为空。尝试没有这个条件,但改为使用以下条件:

RewriteCond $1 !=index.php
RewriteRule ^([^/]+)$ /index.php?page=$1 [L]

答案 1 :(得分:0)

您的第二个测试模式(^$)仅匹配用户未放入任何路径信息但包含查询字符串的情况(例如 www.example.com/?id= 12 )。另请注意,反向引用$1在该规则中也没有任何价值。

最简单的解决方案就是将这两个规则结合起来,因为您可以使用QSA标志来为您附加id=#部分:

Options +FollowSymlinks
RewriteEngine on

RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^([^/]+)$ /index.php?page=$1 [QSA,L]