2016-10-15 10 views
0

のみプリティURLを使ってアクセスを取得:それはmysite.com/verses/view/158を使用してアクセスを行うために正常に動作しYii2は、私は次のようなURLマネージャを使用してい

'urlManager' => [ 
      'enablePrettyUrl' => true, 
      'showScriptName' => false, 
      'rules' => [     
       'verses/view/<id:\d+>' => 'verses/view',     
      ], 
     ], 

。問題は、平文でないURL、つまりmysite.com/verses/view?id=158のようなプレーン・ゲット・パラメータを使用して同じコンテンツにアクセスすることは可能です。かなりのURLを使ってアクセスを制限する方法が必要です。

私は、別に規則の次のカップルを試してみましたが、私が得ているもの:

  1. 'verses/view<?id=>' => 'Error404',
  2. 'verses/view?id=<\d+>' => 'Error404',

答えて

1

このような制限のポイントはありませんか?必要UrlManagerで

public function actionView($id) 
{ 
    if (strpos(\Yii::$app->request->getUrl(), '?') !== false) { 
     throw new \yii\web\BadRequestHttpException; 
    } 
    // ... the rest of action 
} 

変更なし:

とにかく、それを行うための一つの方法は、このようなものです。

+0

また、このチェックを['beforeAction'](http://www.yiiframework.com/doc-2.0/yii-base-controller.html#beforeAction() - を使ってコントローラのすべての動作に一般化することもできます。詳細) – SaidbakR

1

UrlManagerパラメータenableStrictParsing = trueを試してみてください。

どうしますか? UrlManagerはすべてのrullをチェックし、すべてが要求に一致しません。したがって、デフォルトではすべてのデフォルトルールがチェックされます。デフォルトルールの中では、ルールは?id=であり、プリフォームはそのルールにルーティングされます。

したがって、そのルートを回避するには、UrlMangerルールに可能なすべてのルートをリストし、enableStrictParsing = trueとする必要があります。 config rulesパラメータにリストされていないルートは無視されます。

+0

これは良い解決策です。しかし、アプリケーションがアクセス可能でなければならないすべてのパブリックアクションについて非常に大きなルールリストを作成することは必須です。これは物事をより複雑にします。 – SaidbakR

+0

'//'のようなもっと一般的なルールを使うだけでいいです –

関連する問題