.htaccess没有正确转换百分比编码哈希(#)

时间:2016-03-19 16:49:14

标签: php apache .htaccess

我的PHP文件会查找网址参数id,以使网址如下所示:

www.example.com/player.php?id=player_name

其中player_name是id。我使用.htaccess清理了URL,因此URL看起来像这样:

www.example.com/Player/player_name/

除了我传入一个玩家ID,例如#octothorpe(编码为%23octothothpe)之外,情况一直很好。由于某种原因,它仍然作为URL中的片段读取并被服务器忽略,因此当PHP文件查找id时,它无法找到它。有趣的是,如果我使用丑陋的URL

www.example.com/player.php?id=%23octothorpe

它的作品完全没问题,但是当我做的时候

www.example.com/Player/%23octothorpe

无法找到id

.htaccess文件的相关部分如下:

RewriteEngine on
RewriteCond %{HTTP_HOST} ^example\.com$ [NC]
RewriteRule ^(.*)$ http://www.example.com/$1 [R=301,L]

RewriteRule ^Player/(.*)/$ player.php?id=$1
RewriteRule ^Player/(.*)$ player.php?id=$1

2 个答案:

答案 0 :(得分:0)

问题是url片段没有传递给apache服务器。在查询字符串参数中使用它的地方,它不被视为url片段,这就是它工作的原因。

Why the hash part of the URL is not in the server side?

如果您的ID包含哈希字符,则需要为您的网址考虑另一种策略。解决方案实际上取决于您应用程序的更广泛背景。

答案 1 :(得分:0)

OP在这里,我想出了我的问题。问题是Apache在被htaccess转换时解码了我的URL,所以我在我的规则上使用了[B]标志,以便

RewriteRule ^Player/(.*)/$ player.php?id=$1

成了

RewriteRule ^Player/(.*)/$ player.php?id=$1 [B]