2017-01-11 9 views
1

Laravel 5.3では、私のルート(web.php)ファイルに問題があります。ユーザーが変数$urlを "www.website.com"に設定すると、すべてがOKですが、 "http:// www.website.com"と入力すると、パラメータは「/」で切り詰められ、エラーが表示されます。どのようにこの問題を克服する? /としてユーザーが/を動的ルートに入力すると、NotFoundHttpExceptionエラーが発生する

Route::get('/result/{url}', function($url){ 
    return view('result', ['url'=>$url]); 
}); 
+1

あなたのURLをエンコードする必要があります。 '/'はセパレータとして扱われます。 –

+0

http://imgur.com/a/5WIT5エンコードが役に立たないようです。私は '$(document).ready(function(){ $( '#form')}を使ってそれをエンコードしました。 パラメータ=(encodeURIComponentで(パラメータ)); window.locationの= "/結果/" +パラメーター; リターン偽; //}はフォームアクション をキャンセルfalseを返す); }); ' – Mkey

答えて

1

テストの後、あなたが得る404エラーにつながる%2f/としてLaravelはURLをデコードして扱うことが表示されます:あなたは、URL爆発する機能を作成することにより、URLからhttp://を削除することができます。

回避策は、パラメータ内のすべての文字を許可するようにルート定義を変更することです。ここでは、変更するために必要なものです:

Route::get('/result/{url}', function($url){ 
    return view('result', ['url'=>$url]); 
})->where('url', '.*'); // allows all chars in the `url` parameter 

この.*制約は、このパラメータは任意の文字を受け入れることができます。この方法の欠点は、スラッシュをすべて食べるため、このパラメータは最後のパラメータでなければならないということです。他のルートパラメータを区切ることはできません。

+0

スーパーそれが動作します。将来の参照のための質問 - 理論的に、他のルートパラメータを追加できるように、 '。*'の代わりに複雑な正規表現を書くことができますか? – Mkey

+0

はい、そこに必要な正規表現を置くことはできますが、URLを他のパラメータと区別するのは非常に難しいでしょう –

0

http://www.website.comでのURLでリソースとして使用することはできませんURLを分離します。

function explodeURLIfNeeded($url) { 
    $url = end(explode('/', $url)); 
    return $url; 
} 
関連する問題