Laravel: Encoded forward slash (%2F) not routing correctly
LaravelでURLエンコードされたスラッシュ(%2F)を含むパラメータが正しくルーティングされない問題
概要
LaravelのルートパラメータにURLエンコードされたスラッシュ(%2F)が含まれている場合、正しくルーティングされず404エラーになる問題です。ファイルパスやURLをパラメータとして渡す際に発生します。
エラーメッセージ
404 Not Found
Symfony\Component\HttpKernel\Exception\NotFoundHttpException
No route found for "GET /files/path%2Fto%2Ffile"
Route parameter decoded incorrectly
原因
- Webサーバーの処理: Apache/Nginxが
%2Fをデコードしてしまう - Laravelのルート解決: スラッシュがパス区切りとして解釈される
- URLデコードのタイミング: パラメータがデコードされる前にルートマッチングが行われる
- 正規表現の制限: デフォルトの正規表現がスラッシュを許可しない
解決策
1. whereでスラッシュを許可
| |
2. グローバルパターンを定義
| |
3. Base64エンコードを使用
| |
4. Apache設定の変更
| |
| |
5. Nginx設定の変更
| |
6. クエリパラメータとして渡す
| |
7. カスタムエンコーディング
| |
8. ルートモデルバインディングのカスタマイズ
| |
9. ミドルウェアでの処理
| |
10. フォールバックルート
| |
11. 正規表現でスラッシュを明示的に許可
| |
デバッグ方法
| |
よくある間違い
whereを指定せずにスラッシュを含むパラメータを使う- ApacheのAllowEncodedSlashesを設定し忘れる
- Base64エンコード時にURL安全な形式を使わない
- クエリパラメータで簡単に解決できるのにルートパラメータにこだわる
関連エラー
参考リンク
Laravel の他のエラー
この記事は役に立ちましたか?