Zend framework htaccess https重定向仅适用于特定Zend框架控制器/操作

Zend framework htaccess https重定向仅适用于特定Zend框架控制器/操作,zend-framework,.htaccess,ssl,url-rewriting,ssl-certificate,Zend Framework,.htaccess,Ssl,Url Rewriting,Ssl Certificate,我是这个社区的新手,但我发现它有时真的很有用 我已经寻找了很多答案,但我没有找到我需要的任何东西。我试着自己解决这个问题,但还是会出错,所以我希望能找到一个能给我指明正确方向的人…:-) 我有一个“经典”的ZF网站,有许多控制器/动作URL,它们通过.htaccess文件重定向到index.php 现在,我需要的是将两个控制器重定向到https ssl连接,排除两个控制器的某些操作 我试图这样做的方式是: Options +FollowSymLinks RewriteEngine on Re

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

我已经寻找了很多答案,但我没有找到我需要的任何东西。我试着自己解决这个问题,但还是会出错,所以我希望能找到一个能给我指明正确方向的人…:-)

我有一个“经典”的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 controller时,它似乎起作用 但是,当我转到另一个控制器时,例如/index或/about,它不会重定向到http连接(端口80),如果我尝试稍微更改重写条件regex,它有时会执行重定向循环,浏览器会通知我阻止与站点的连接

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

提前谢谢

亚历山德罗

试试这些规则(替换相应的行):

  • 这些规则有点简单(HTTPS将应用于
    /member/
    /shop/
    控制器中的所有URL(例如
    /member/login
    /member/dashboard
    /member/orders/15423/invoice
    等)
  • 在RewriteCond指令中,否定
    应该在之前
    ^
    ——如果您想要自己的规则,那么将
    RewriteCond$1^!((会员商店)/(?!(索引登录))(.*)
    替换为
    RewriteCond$1^((会员商店)/(?!(索引登录))(.*)

  • 我们用于重定向到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']);
            }
        }
    }
    
    此外,这里还有另一种使用动作助手的方法,如果您需要,它会更详细一些:


    希望能有所帮助!

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

    我已经在本地linux机器上测试了htaccess,结果是一样的…分别测试了两个https条件语句(on和off),它们可以根据给定的RewriteCond正则表达式正确重定向。当将http重定向放在一起时,只有从http到https的重定向可以正常工作。 Https到http重定向仅在正则表达式不匹配时有效,否则将重定向到

    因此,我最终尝试删除最后一条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
    

    我终于解决了它!我坚持寻找答案,因为我认为使用.htaccess可以更干净、更智能、更易于维护。 问题主要是由于“ssl到非ssl”块中使用的regexp与传递的值不正确匹配(现在最好匹配的是读取env变量%{The_REQUEST},在某些情况下避免了erroneus重定向循环)

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

    
        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]
    

    首先,感谢您的建议和宝贵时间!我正试图简化并实现您的解决方案,但我注意到.htaccess的一个非常奇怪的行为。现在它看起来如下所示:但以这种方式,它总是重定向到index.php文件…我还尝试在^在它更改为https后将其删除,但它不会在其他控制器上返回http…@Alessandro-Hmm…我的测试服务器上没有https,所以我通过子域模拟它。规则工作正常。您可以在其他浏览器中尝试它(重定向可能已被浏览器缓存)或者清除浏览器缓存并重新启动。您也可以尝试
    RewriteCond%{HTTPS}!=off
    而不是
    RewriteCond%{HTTPS}on
    好的,我将直接尝试!我用您的代码确认这一点(无任何更改),在我的服务器上,行为是将/member请求重定向到,如果我调用另一个控制器,控制器显示正确,如果我使用https协议,它将正确重定向到http。我无法使工作正常的事情是在我使用/member控制器时重定向到https…我不知道为什么…?我个人想为此,请不要触摸我的htaccess。如果方案不是https,我会在我的ZF应用程序中使用重定向。非常感谢您的建议。如果不是,明天我将尝试。htaccess将获得成功!再次感谢!
    
    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
    
    
        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]