当参数具有%23

时间:2019-12-11 04:04:36

标签: php api .htaccess parameters friendly-url

我正在使用PHP,HTML,CSS和JavaScript编写的网站上-该网站根据URL参数(例如用户名和其他数据)进行API调用。

我有一个用于显示数据的主文件,我们称它为user.php-该文件接受URL参数以根据特定用户以及他们当前正在查看的“标签”来显示API数据(基于标签页)网址参数),“标签”基于page =“ xxxx”的最后一个网址参数

例如:website.com/user.php?platform=x&username=Name&page=overview-API数据基于用户名和平台参数显示在页面上,页面参数仅表示他们正在查看广告的特定部分user.php文件。

.htaccess文件进行了一些重写,以便将这些参数重写为友好的URL,例如website.com/user/platform/username/pagename

我遇到的问题是用户名中的名称中包含井号(#)。我目前正在用“%23”替​​换哈希值。当我这样做时,在user.php页面website.com/user/platform/user%23name/overview的“概述”部分显示数据没有问题,但是当我单击链接以显示用户的另一部分时.php,例如website.com/user/platform/user%23name/otherpage都会中断

如果我的用户名没有'%23',那么一切正常,例如website.com/user/platform/username/overview,然后单击指向website.com/user/platform/username/otherpage的链接

我是否需要了解包含散列或'%23'的URL参数?我似乎无法弄清楚为什么它可以与初始page参数一起使用,但不能与其他参数一起使用。

这是我用于友好网址的.htaccess

RewriteRule ^(.+)/(.+)/(.+)/(.+)$ /user.php?platform=$2&gtag=$3&page=$4 [L]

RewriteRule ^/user.php?platform=$2&gtag=$3&page=$4 /user/$2/$3/$4 [L,R=301]

1 个答案:

答案 0 :(得分:0)

您说您要进行api调用,因此数据不会来自用户输入。

有个窍门,但很丑:
您可以使用全局变量$ _SERVER [REQUEST_URI]或$ _ENV [REQUEST_URI] 它们将包含“ nice” URL,您可以通过“ /”将其展开并获取实际变量。由于您的规则,您将登录到user.php,并且它不应破坏重定向。我在服务器上对其进行了测试,并且可以正常工作。

我尝试过

https://www.example.com/te%23st/te%23st/te%23st/te%23st

和$ _SERVER [REQUEST_URI]是

/te%23st/te%23st/te%23st/te%23st

因此您甚至可以将规则重写为:

RewriteRule "^(.+)/(.+)/(.+)/(.+)$" "/user.php" [L]

它可以工作,并且您不必依赖服务器重写。