2

現在、Zend MVC アプリケーションからコントローラーを構築しています。これは、ページを設定するための json サービスとしてのみ使用されます。ユーザーがこのエンドポイントにアクセスするためにGETメソッドのみを使用するように制限したい(セキュリティ上の理由から)。

この投稿に従いました_forward() in Zend does not work? しかし、働くことができませんでした。

preDispatch を使用して get 以外のリクエストを検出し、同じコントローラーで errorAction に転送したいと考えています。私のコードは次のようになります。

public function preDispatch(){
    $this->_helper->layout()->disableLayout();
    $this->_helper->viewRenderer->setNoRender();
    //Restrict this Controller access to Http GET method
    if(!($this->getRequest()->isGet())){
        return $this->_forward('error');
    }
}

public function errorAction(){
    $this->getResponse()->setHttpResponseCode(501);
    echo "Requested Method is not Implemented";
}

投稿リクエストでページをテストすると、スローされます

PHP 致命的なエラー: 最大実行時間の 30 秒を超えました

私はそれで動作しました

$this->_redirect("service/error");

この状況を処理する唯一の/最善の方法であるかどうか疑問に思っています。

どんな助けでも本当に感謝しています。前もって感謝します。

4

1 に答える 1

2

呼び出し_forwardが機能しない理由は、リクエスト メソッドが変更されないためです。errorそのため、リクエストが常にPOST.

_forwardリクエストがディスパッチされたときに呼び出されるモジュール、コントローラー、およびアクションを変更することで機能し、_redirect実際には 302 リダイレクトを返し、ブラウザーによって追加の HTTP リクエストが発生します。

_forwardどちらの方法でも問題ありませんが、追加の HTTP リクエストを必要としないため、こちらを使用したいと思います (ただし、POSTリクエストが拒否されることは保証されます)。

このコードはあなたのために働くはずです:

    if(!($this->getRequest()->isGet())){
        // change the request method - this only changes internally
        $_SERVER['REQUEST_METHOD'] = 'GET';

        // forward the request to the error action - preDispatch is called again
        $this->_forward('error');

        // This is an alternate to using _forward, but is virtually the same
        // You still need to override $_SERVER['REQUEST_METHOD'] to do this
        $this->getRequest()
             ->setActionName('error')
             ->setDispatched(false);
    }
于 2012-06-11T18:35:32.880 に答える