特定の静的文字列以外に一致するルートを作成するよりも、2つのルートを作成する方が明確です。
// route that matches forbidden static strings, optionally with a postfix slug
$router->get('/{forbidden}/{optional_path?}', function () {
return response('Not found', 404);
})->where([ 'forbidden' => '(?:string1|string2)', 'optional_path' => '.*' ]);
// route that matches anything else (order of definition matters, must be last)
// might also consider using Route::fallback(), but I prefer to leave that
// alone in case my future self changes this below and opens up a hole
$router->get('/{anything?}', function () {
return response('Found', 200);
})->where([ 'anything' => '.*' ]);
結果は*:
domain
=> 200件見つかりました
domain/
=> 200件見つかりました
domain/abc
=> 200件見つかりました
domain/string1
=> 404見つかりません
domain/string1/
=> 404見つかりません
domain/string1/abc
=> 404見つかりません
domain/string10
=> 200件見つかりました
domain/string10/
=> 200件見つかりました
domain/string10/abc
=> 200件見つかりました
domain/string2
=> 404見つかりません
domain/string2/
=> 404見つかりません
domain/string2/abc
=> 404見つかりません
domain/string20
=> 200件見つかりました
domain/string20/
=> 200件見つかりました
domain/string20/abc
=> 200件見つかりました
除外について考える必要がないので、私はこれがより明確だと思います。むしろ、私が禁止したいものと正確に一致し、Laravelに他のすべてのものに反応させる(フェールオープンポリシー)と考えることができます。これは設計基準を満たさない可能性がありますが、コードがより明確になると思います。
また、コードのパフォーマンスが向上しています。 ?!
バックトラックする必要があります。これは、定義により、フォワードマッチングよりもコストが高くなります。
Laravelの環境はありませんが、あなたの試みがうまくいかなかった理由を推測するつもりです。LaravelはSymfonyルーターを使用しますが、Slugのルックアラウンドをサポートしていません。IIRC、ルックアラウンドが検出されると、Symfonyはルックアラウンドを、パターンをバインドしたスラッグではなく、URL全体に適用します。これは、アンカー(^、$)と貪欲(*)のメタ文字がどのように機能するかについての開発者の考えを混乱させます。開発者はある仮定の下で動作しているが、基礎となるライブラリは別の仮定で動作しているため、これを機能させようとすると、悪い経験につながる可能性があります。
*完全な開示。私はこれをルーメンのために書いた後、精神的にそれをララヴェル形式に変換しました。変換エラーが発生している可能性があります。これがオリジナルのルーメンです:
$router->get('/{forbidden:(?:string1|string2)}[/{optional_path:.*}]', function () {
return response('Not found', 404);
});
$router->get('{anything:.*}', function () {
return response('Found', 200);
});