1

我已经定义了这样的路线:

$app->map(['GET', 'POST'],'/abc/[{url}]', function ($request, $response, $args) {

    return $response;
})->add(new CustomMiddleware());

当我传递一个没有http://但给我一个带有or的404 page not found-Page的 url 时,它工作正常。我也尝试过使用 url 编码的字符串,但给出了同样的错误:http://https://

http://localhost/slim/public/index.php/abc/http%3A%2F%2Fstackoverflow.com

The requested URL /slim/public/index.php/abc/http://stackoverflow.com was not found on this server.

我正在使用 Slim 版本 3.1。

4

1 回答 1

5

在 url 中使用 url

当您添加带有斜杠的 url 时,路由不会得到执行原因,那么在 url 之后还有其他路径,该路径未在路由内定义:

例如example.org/abc/test,工作正常,但example.org/abc/http://x 只能与这样的路由定义一起使用/abc/{url}//{other}

在 url 中使用编码的 url

Apache 以 404 Not Found 错误阻止 URL 中带有%5Cfor\%2Ffor/的所有请求,这是出于安全原因。因此,您不会从 slim 框架中获得 404,而是从您的网络服务器获得 404。所以你的代码永远不会被执行。

您可以通过设置您的 apache 来启用此AllowEncodedSlashes On功能httpd.conf

我的建议来解决这个问题

将 url 添加为 get 参数,在不更改 apache 配置的情况下使用编码斜杠是有效的。

示例调用http://localhost/abc?url=http%3A%2F%2Fstackoverflow.com

$app->map( ['GET', 'POST'], '/abc', function ($request, $response, $args) {
    $getParam = $request->getQueryParams();
    $url= $getParam['url']; // is equal to http://stackoverflow.com
});
于 2016-09-07T16:40:37.597 回答