1

nikic/FastRoute を使用する Slim 3 を使用していますが、次のようなエンドポイントで問題が発生しています。

$app->get('/count/{url}', function ($request, $response) use ($curl) {
    $controller = new Proximate\Controller\CountUrl($request, $response);
    $controller->setCurl($curl);
    return $controller->execute();
});

私の計画は、urlencode された URL をコントローラーに渡し、{url}それをコントローラーに挿入することです。たとえば、 の場合http://www.example.com、リクエストは次のようになります。

curl \
    --verbose \
    http://localhost:8080/count/http%3A%2F%2Fwww.example.com%2F

ただし、これは 404 で失敗するため、明らかに一致していません。これも失敗します:

curl \
    --verbose \
    http://localhost:8080/count/http%3A%2F%2Fwww.

ただし、奇妙なことに、これは一致します (つまり、末尾のドットなし):

curl \
    --verbose \
    http://localhost:8080/count/http%3A%2F%2Fwww

私は当初、それを混乱させていたのは urlencoded スラッシュだと思っていました ( %2F) が、これらの文字なしで試してみたところ、実際には文字列のどこにでもあるドットであることがわかりました。これが一致しないのはなぜですか?これを機能させるには、正規表現の一致が必要ですか?

このアプリには PHP 組み込み Web サーバーを使用しています。

4

1 に答える 1

4

もう少し調べてみると、これは PHP の組み込み Web サーバーが原因であり、Slim や FastRoute の問題ではないことがわかりました。これがSlim のバグ報告で、ここがPHPのバグ報告です。

Won't fix残念ながら、サーバーはテスト専用であるため、コア PHP チームは としてマークしました。個人的には、このサーバーを本番環境に使用しないことに関する警告は少し誇張されていると思います (Docker コンテナーは、そこに Apache を投入していないため、適度に管理可能なサイズのままです)。

ありがたいことに、これには修正があります。URL でスクリプト名を指定すると、PHP は残りのスクリプトをルーティング システムに正しく渡します。そのようです:

curl \
    --verbose \
    http://localhost:8080/index.php/count/http%3A%2F%2Fwww.example.com%2F
#                         ^^^^^^^^^
#                         Script name

もちろん、これはあまりエレガントではないので、別の解決策に切り替えるかもしれません。私はまだ試していませんが、この PHP のみの Web サーバーは非常に有望に見えます。

于 2017-01-02T20:19:06.187 に答える