禁用特定ZF1模块的HTTPS

时间:2013-12-24 13:07:52

标签: php apache http zend-framework https

要求: 我在ZF1中有一个现有站点,运行在HTTPS上。以下是在虚拟主机中设置:

DocumentRoot /srv/sitename/public

...

SSLEngine on
SSLCertificateFile /etc/apache2/server.crt
SSLCertificateKeyFile /etc/apache2/server.pem

现在问题是,我们希望使用HTTP而不是HTTPS添加几个页面(整个模块)。例如,我们需要关注URLS

现有

https://www.sitename.com/module1/...
https://www.sitename.com/module2/...
https://www.sitename.com/module3/...

新要求

http://www.sitename.com/modulex/...

在ZF1中,由于我们有单个入口点(public / index.php),我想知道是否可能。

在ZF1中,是否可以通过HTTPS运行少量模块,而使用HTTP运行其他一些模块?如果是,我们该怎么做?

3 个答案:

答案 0 :(得分:2)

如果您希望仅通过HTTP请求访问create moduleX,请尝试以下操作:

class ModuleX_Bootstrap extends Zend_Application_Module_Bootstrap
{
   public function _initModule(){
       $this->_redirect('http://' . $_SERVER['HTTP_HOST'] . $_SERVER['PHP_SELF']);
   }

}

答案 1 :(得分:2)

在我之前创建的Zend Framework应用程序中,我必须在配置时使用HTTPS,所以我按照以下方式执行:

// Force users on HTTPS if configured
if ( $config->httpsOnly && empty($_SERVER['HTTPS']) ) {
    $httpsUrl = 'https://'.$_SERVER['SERVER_NAME'].$_SERVER['REQUEST_URI'];
    header("Location: $httpsUrl");
}

它运行得很好,我想在你的情况下,你可以在模块控制器的init函数中完成它(或者如果你使用抽象,你可以在抽象控制器中使用它),我会建议像:

// Force users on HTTP, if using HTTPS
if ( !empty($_SERVER['HTTPS']) ) {
    $httpUrl = 'http://'.$_SERVER['SERVER_NAME'].$_SERVER['REQUEST_URI'];
    header("Location: $httpUrl");
}

我希望这有助于

答案 2 :(得分:0)

如果这是一个常规的apache问题,你可以用一些重写规则解决这个问题 首先使您的vhost配置同时服务于:443(https)和:80(http)具有相同的DocumentRoot。

然后使用像这样的RewriteRule(在vhost conf中或在DocumentRoot的htaccess中):

RewriteEngine on
RewriteCond %{HTTPS} on
RewriteCond %{REQUEST_URI} ^/modulex
RewriteRule ^(.*)$ http://%{HTTP_HOST}/$1 [R=301,L]
RewriteCond %{HTTPS} off
RewriteCond %{REQUEST_URI} !^/modulex
RewriteRule ^(.*)$ https://%{HTTP_HOST}/$1 [R=301,L]

基本上,第一条规则说如果尝试在https上点击modulex,则重定向到http。 第二条规则说,如果尝试在http下击中modulex以外的任何内容,请重定向到https。