【发布时间】:2016-05-31 20:19:08
【问题描述】:
我们正在与其他系统管理员一起使用 lighthtpd->nginx/1.8.1 迁移和重写规则。
我们有这样的 API 和重写规则(在 nginx 中):
rewrite ^/api/(.*)$ /api.php?action=$1 last;
在我的 PHP API 中,我使用explode PHP 函数将“动作”拆分为一个数组。
因此,GET /api/article/search&key=AUTHENTIFICATION_KEY&q=SEARCH_QUERY
重写为/api.php?action=article/search&key=AUTHENTIFICATION_KEY&q=SEARCH_QUERY
PHP系统数组$_GET包含
"action'" => "article/search"
"key"=>"AUTHENTIFICATION_KEY"
"q"=>SEARCH_QUERY
到目前为止一切顺利...除非搜索查询中有空格,如下所示:
GET /api/article/search&key=AUTHENTIFICATION_KEY&q=SEARCH QUERY&blabla=lol&test=wes (last parameters given as examples)
我不知道为什么,但在这种情况下,URL 中的 & 字符似乎被转义了。因此,我的PHP $_GET 数组只有 on 字段:/api 之后的整个字符串。
["action"] => "article/search&key=AUTHENTIFICATION_KEY&q=SEARCH QUERY&blabla=lol&test=wes"
和$_GET[['key'], $_GET['q'] etc are empty ...
有什么想法吗?
编辑:但是,如果我将 proxy_pass 与位置一起使用,一切正常:
location ~ /api/(.*) {
proxy_redirect off;
proxy_pass https://127.0.0.1/api.php?action=$1;
但我觉得他的解决方案真的很丑......更不用说我们会有很多重写规则来手动重写(大声笑,重新编码,在配置文件中)从 lighttp 到 nginx
编辑:实际上,我认为@Alexey 提出了正确的问题!当我们使用 lighttpd 时,第一个 GET 参数是在重写规则中设置的,然后是“?”。 对 URL 进行编码时,Nginx 似乎无法以这种方式工作,即使使用“?”也是如此。在重写规则中,第一个 GET 参数必须设置为“?”,而不是“&”。 我们正在运行一些测试,但看起来是这样的
GET /api/article/search?key=AUTHENTIFICATION_KEY&q=SEARCH QUERY&blabla=lol&test=yes
有效:)
【问题讨论】:
-
但是你为什么用
&而不是?呢? -
发出请求时,请尝试对请求中的值进行 urlencode。看看有没有帮助。
GET /api/article/search&key=AUTHENTIFICATION_KEY&q=SEARCH%20QUERY&blabla=lol&test=wes -
@AlexeyTen 因为我使用“?”在重写中,要引入 GET 参数“action”。 Firefox 或 PowerShell InvokeRestmethod 自动对请求进行编码,我可以在 nginx 日志中看到它。另一方面,当我使用 proxypass 时,请求没有被编码,然后它就可以工作了。
-
你应该使用
GET /api/article/search?key=...
标签: php nginx url-rewriting