【问题标题】:htaccess https redirect only on specific Zend Frameworks controller/actionshtaccess https 仅在特定 Zend Frameworks 控制器/操作上重定向
【发布时间】:2011-09-28 15:19:53
【问题描述】:

我是这个社区的新手,但我发现它有时真的很有用。

我已经搜索了很多答案,但没有找到我需要的任何东西。我试图自己解决它,但我仍然遇到错误,所以我希望找到能告诉我正确方法的人...... :-)

我有一个“经典”ZF 网站,其中有许多控制器/操作 url,它们通过 .htaccess 文件重定向到 index.php。

现在,我需要将几个控制器重定向到 https ssl 连接,不包括两个控制器的某些操作。

我尝试这样做的方式是:


Options +FollowSymLinks

RewriteEngine on
RewriteBase /

RewriteCond %{HTTP_HOST} ^mydomain\.tld [NC]
RewriteRule ^(.*)$ http://www.%{HTTP_HOST}/$1 [R=301,L]

RewriteCond %{HTTPS} on
RewriteCond $1 ^!((member|shop)/(?!(index|login))(.*))
RewriteRule ^(.*) http://%{HTTP_HOST}/$1 [L,R=301]

RewriteCond %{HTTPS} off
RewriteCond $1 ^((member|shop)/(?!(index|login))(.*))
RewriteRule ^(.*) https://%{HTTP_HOST}/$1 [L,R=301]

RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule !\.(js|ico|gif|jpg|png|css|swf|pdf|txt)$ index.php

当我转到 /member 控制器时它似乎工作 但是,当我转到另一个控制器时,例如 /index 或 /about 它不会重定向到 http 连接(端口 80),如果我尝试稍微更改重写条件正则表达式,它有时会执行重定向循环并且浏览器会通知我阻止与该网站的连接。

有没有人可以向我展示在我的重写条件下使用正确的合成器,以允许两个控制器(不包括给定的操作)在 https 连接下并在更改控制器时返回标准 http 连接?

提前致谢。

亚历山德罗

【问题讨论】:

  • 就我个人而言,我不会为此碰我的 htaccess。如果方案不是 https,我会在我的 ZF 应用程序中使用重定向。

标签: zend-framework .htaccess ssl url-rewriting ssl-certificate


【解决方案1】:

试试这些规则(替换适当的行):

RewriteCond %{HTTPS} on [NC]
RewriteCond %{REQUEST_URI} !^/(member|shop)/ [NC]
RewriteRule ^(.*)$ http://%{HTTP_HOST}/$1 [L,R=301]

RewriteCond %{HTTPS} off [NC]
RewriteCond %{REQUEST_URI} ^/(member|shop)/ [NC]
RewriteRule ^(.*)$ https://%{HTTP_HOST}/$1 [L,R=301]
  1. 这些规则有点简单(HTTPS 将应用于 /member//shop/ 控制器中的所有 URL(例如 /member/login/member/dashboard/member/orders/15423/invoice 等)
  2. 在 RewriteCond 指令中,否定 ! 应该是 before ^ -- 如果您想要自己的规则,请将 RewriteCond $1 ^!((member|shop)/(?!(index|login))(.*)) 替换为 RewriteCond $1 !^((member|shop)/(?!(index|login))(.*))

【讨论】:

  • 首先,感谢您的建议和您的宝贵时间!我试图简化和实施您的解决方案,但我注意到这个.htaccess 的一个非常奇怪的行为。现在它看起来像下面这样:
  •  选项 +FollowSymLinks RewriteEngine on RewriteBase / RewriteCond %{HTTPS} on [NC] RewriteCond %{REQUEST_URI} !^/(member|shop)/(.*) [NC ] RewriteRule ^(.*)$ http://%{HTTP_HOST}/$1 [L,R=301] RewriteCond %{HTTPS} off [NC] RewriteCond %{REQUEST_URI} ^/(member|shop)/(.* ) [NC] RewriteRule ^(.*)$ https://%{HTTP_HOST}/$1 [L,R=301] RewriteCond %{REQUEST_FILENAME} !-f RewriteRule !\.(js|ico|gif|jpg|png |css)$ index.php 
  • 但是以这种方式它总是重定向到 index.php 文件...我也尝试使用!在 ^ 前面,但这样它什么也不做,如果我把它放在它更改为 https 之后,但它永远不会回到其他控制器上的 http ...
  • @Alessandro 嗯...我的测试服务器上没有 HTTPS,所以我通过子域模拟它......并且规则工作正常。您可以在其他浏览器中尝试(重定向可能已被浏览器缓存)或清除浏览器缓存并重新启动它。你也可以试试RewriteCond %{HTTPS} !=off 而不是RewriteCond %{HTTPS} on
  • 好的,我会直接尝试!我确认使用您的代码(没有任何更改),在我的服务器上,行为是 /member 请求被重定向到 mydomain.tld/index.php,如果我调用另一个控制器,控制器将显示为 mydomain.tld/othercontroller,如果我是使用 https 协议,它会正确重定向到 http。当我使用 /member 控制器时,我无法做到的事情是重定向到 https ......我不知道为什么......?
【解决方案2】:

我们用来重定向到 https 的一种方法是保留默认的 Zend Framework .htaccess 设置,并创建一个操作助手以在需要时重定向到 https。我们的动作助手代码是:

<?php
class RequireSSL extends Zend_Controller_Action_Helper_Abstract
{
    public function direct()
    {
        if(empty($_SERVER['HTTPS']) && $config['billing']['requireSSL'])
        {
            $redirector = $this->getActionController()->getHelper('Redirector');
            $redirector->goToUrlAndExit('https://' . $_SERVER['SERVER_NAME'] . $_SERVER['REQUEST_URI']);
        }
    }
}

然后,当您处于需要通过 HTTPS 访问的控制器操作中时,您只需在开头调用此函数:

$this->_helper->requireSSL();

此外,如果您需要,这里还有另一种使用动作助手的方法,它会更详细一点:

http://juriansluiman.nl/en/article/110/in-control-of-https-for-action-controllers

希望有帮助!

【讨论】:

  • 非常感谢您的建议。明天我会试一试,如果没有.htaccess会成功!再次感谢!
【解决方案3】:

我已经发现了问题的根源,但我仍然需要支持来了解如何解决它。

我已经在本地 linux 机器上测试了 htaccess,结果是一样的......分别测试两个 https 条件语句(打开和关闭)它们可以根据给定的 RewriteCond 正则表达式正确重定向。将只有从 http 到 https 的重定向放在一起时。 Https to http 重定向仅在正则表达式不匹配时才有效,否则重定向到http://www.mydomain.tld/index.php

所以我终于尝试删除最后一个 htaccess 语句,它开始正常工作,但是很明显,它没有找到 url,因为它不再重定向到 index.php。

看起来在正确的 https 重定向 index.php 之后会产生问题。所以我问自己是否有办法避免这种情况并使其正常工作。

正如我之前写的,这似乎是这个 htaccess 的一个常见问题,因为它在测试和生产服务器上的行为是相同的(不同的 linux 风格)。

我把工作代码放在这里:


Options +FollowSymLinks

RewriteEngine on
RewriteBase /

#RewriteCond %{HTTP_HOST} ^mydomain\.tld [NC]
#RewriteRule ^(.*)$ http://www.%{HTTP_HOST}/$1 [R=301,L]

RewriteCond %{HTTPS} on
RewriteCond $1 !^((member|shop)/(?!(index|login))(.*))
RewriteRule ^(.*) http://%{HTTP_HOST}/$1 [L,R=302]

RewriteCond %{HTTPS} off
RewriteCond $1 ^((member|shop)/(?!(index|login))(.*))
RewriteRule ^(.*) https://%{HTTP_HOST}/$1 [L,R=302]

#RewriteCond %{REQUEST_FILENAME} !-f
#RewriteRule !\.(js|ico|gif|jpg|png|css|swf|pdf|txt)$ index.php

【讨论】:

    【解决方案4】:

    终于解决了!我坚持不懈地寻找答案,因为我认为使用 .htaccess 执行此操作更清洁、更智能且易于维护。 问题本质上是由于“ssl to non-ssl”块中使用的正则表达式与传递的值不正确匹配(现在读取环境变量%{THE_REQUEST}最好匹配,在某些情况下避免错误重定向循环。

    我将工作代码粘贴在这里以供进一步参考:

    
        Options +FollowSymLinks
    
        RewriteEngine On
    
        RewriteBase /
    
        RewriteOptions MaxRedirects=1
    
    
    
        RewriteCond %{HTTP_HOST} ^yoursite\.tld [NC]
    
        RewriteRule ^(.*)$ http://www.%{HTTP_HOST}/$1 [R=301,L]
    
    
    
        RewriteCond %{HTTPS} off
    
        RewriteCond %{THE_REQUEST} ^[A-Z]+\ /((controller1|controller2)/(?!(action1|action2))(.*))\ HTTP/
    
        RewriteRule ^(.*)$ https://%{SERVER_NAME}/$1 [L,R=301]
    
    
    
        RewriteCond %{HTTPS} on
    
        RewriteCond %{THE_REQUEST} !^[A-Z]+\ /((controller1|controller2)/(?!(action1|action2))(.*))\ HTTP/
    
        RewriteRule ^(.*)$ http://%{SERVER_NAME}/$1 [L,R=301]
    
    
    
        RewriteCond %{REQUEST_FILENAME} \.(js|css|ico|gif|jpg|png|swf|txt|pdf)$ [OR]
    
        RewriteCond %{REQUEST_FILENAME} -s [OR]
    
        RewriteCond %{REQUEST_FILENAME} -l [OR]
    
        RewriteCond %{REQUEST_FILENAME} -d
    
        RewriteRule ^.*$ - [NC,L]
    
    
    
        RewriteCond %{REQUEST_FILENAME} !-f
    
        RewriteCond %{REQUEST_FILENAME} !-d
    
        RewriteRule ^.*$ index.php [NC,L]
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-12-23
      • 2012-11-07
      • 1970-01-01
      • 2012-07-16
      • 1970-01-01
      • 2014-10-23
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多