1

私はこのようなルートを定義しました:

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

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

なしで URL を渡すと正常に動作しhttp://ますが、 or を含む-Page404 page not foundが返されます。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は、URL 内の%5Cfor\および%2Fforを含むすべてのリクエストを/404 Not Found エラーでブロックします。これはセキュリティ上の理由によるものです。したがって、スリム フレームワークからではなく、Web サーバーから 404 を取得します。したがって、コードが実行されることはありません。

これを有効にするには、Apache の設定AllowEncodedSlashes Onを行いhttpd.confます。

これを修正するための私の推奨事項

Apache の設定を変更せずにスラッシュをエンコードする有効な get パラメータとして URL を追加します。

呼び出しの例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 に答える