https请求在某些页面上但不在所有页面上的zend框架

时间:2010-09-23 10:33:18

标签: php zend-framework

我需要将https放在某些网址上,而不是放在所有网址上。我正在为所有链接使用zend URl视图助手。我有一个* .example.com整个站点的SSL证书。现在我用https://www.example.co打开网站,然后主页或其他网页上的所有链接都包含URL中的https。如何在https网址上做出一些具体请求,其他页面应该正常打开。

我还需要进行一些重定向,这样如果有人打开普通网址中的特定网页,那么他们会重定向到https网址。我认为.htaccess重定向将适用于此。

任何帮助????

提前致谢!!!

2 个答案:

答案 0 :(得分:2)

URL ViewHelper仅汇编路径,绝对来自主机名。所以你需要明确地为你的https链接添加前缀

<? $url = $view->url(array('some' => 'params') /*, $route, $reset*/) ?>
<a href="https://<?= $_SERVER['HTTP_HOST] ?><?= $url ?>">my explicit https link</a>

你应该创建一个自己的小型浏览器,它可以为你工作,也可以检查是否设置了HTTP_HOST等,也可以从配置中取而代之的是$ _SERVER。

  

$ view-&gt; httpsUrl(array('some'=&gt;'params')/ ,$ route,$ reset /);

要确保定义的reqeust必须是https,可以通过添加前端控制器插件甚至是基于所有otehr控制器的抽象控制器类来轻松完成。

插件可能看起来像这样

My_Controller_Plugin_HttpBlacklist extends Zend_Controller_Plugin_Abstract
{
    public function preDispatch(Zend_Controller_Request_Abstract $request)
    {
        // when /foo/bar/baz is requested
        if (($request->getModuleName() == 'foo' &&
            $request->getControllerName() == 'bar' &&
            $request->getControllerName() == 'baz')
            /* || (conditions for more requests)*/) {

            //very basic confifiotn to see if https is enabled, should be done better...
            if (!isset($_SERVER['HTTPS']) || $_SERVER['HTTPS'] != 'on') {

                // should be done with Zend_Http_Reponse instead
                header('Location: https://'. $_SERVER['HTTP_HOST] . $_SERVER['REQUEST_URI']);
                exit;
            }
        }
    }
}
然后只需将其插入

即可
  

$ frontController-&gt; registerPlugin(new My_Controller_Plugin_HttpBlacklist);

答案 1 :(得分:1)

我宁愿使用简单的方法,也不需要对网址生成/路由进行任何更改。我在插件的routeStartup函数中编写了以下行,并且没有对URL路由进行任何更改。

public function routeStartup(Zend_Controller_Request_Abstract $request)
{

   $controller=$this->_controller = $this->_front->getRequest()->getControllerName();
   $action=$this->_controller = $this->_front->getRequest()->getActionName();

    if($_SERVER['SERVER_PORT']!=443)
    {
//controller and actions array to check ssl links
        $actionArr=array('index'=>array('registration'),'account'=>array('editacc','edit'),'dealer'=>array('*'));
        if(array_key_exists($controller,$actionArr)!==false)
        {
            if(in_array($action,$actionArr[$controller]) || $actionArr[$controller][0]=='*')
            {
                $redirector = Zend_Controller_Action_HelperBroker::getStaticHelper('redirector');
                 $redirector->gotoUrl(SITE_LIVE_URL_SSL.$controller."/".$action);    
            }
        }


    }
    else
    {
//controller and action array that should not be on ssl.
          $notAactionArr=array('usersearch'=>array('mainserarch'),'account'=>array('index'),'onlineusers'=>array('*'));
        if(array_key_exists($controller,$notAactionArr)!==false)
        {
            if(in_array($action,$notAactionArr[$controller]) || $notAactionArr[$controller][0]=='*')
            {
                $redirector = Zend_Controller_Action_HelperBroker::getStaticHelper('redirector');
                 $redirector->gotoUrl(SITE_LIVE_URL.$controller."/".$action);    
            }
        }

    }
}