将非安全的Magento页面从https重定向到http

6
Magento有一些很棒的内置功能,如果您通过http请求一个应该是安全的页面,比如结账页面,它会重定向到https。然而,似乎缺少的是,如果有人通过https请求不需要安全保护的页面,例如类别页面,则没有将其重定向到http的功能。
因此,如果有人请求:

https://www.mysite.com/mycategory

他们被301重定向到

http://www.mysite.com/mycategory

有人成功实现了这个吗?

如果没有,那么有人能够指引我找到Magento核心代码中负责重定向到HTTPS的部分,然后我就可以从那里着手解决问题。

5个回答

7

请看下面的方法

app/code/core/Mage/Core/Controller/Varien/Router/Standard.php::_checkShouldBeSecure()

1
刚刚发现了,太好了。 - Johnboy

6
感谢Rich,我在app/code/core/Mage/Controller/Varien/Router/Standard.php::_checkShouldBeSecure() 找到了这个问题。
我修改了这个函数(在app/code/local中创建了一个副本并进行了修改),添加了 elseif 部分。
protected function _checkShouldBeSecure($request, $path='')
{
    if (!Mage::isInstalled() || $request->getPost()) {
        return;
    }

    if ($this->_shouldBeSecure($path) && !Mage::app()->getStore()->isCurrentlySecure()) {
        $url = $this->_getCurrentSecureUrl($request);

        Mage::app()->getFrontController()->getResponse()
            ->setRedirect($url)
            ->sendResponse();
        exit;
    } elseif (!$this->_shouldBeSecure($path) && Mage::app()->getStore()->isCurrentlySecure()) {
        $url = $this->_getCurrentUnsecureUrl($request);

        Mage::app()->getFrontController()->getResponse()
            ->setRedirect($url)
            ->sendResponse();
        exit;
    }
}

然后添加了这个函数。
protected function _getCurrentUnsecureUrl($request)
{
    if ($alias = $request->getAlias(Mage_Core_Model_Url_Rewrite::REWRITE_REQUEST_PATH_ALIAS)) {
        return Mage::getBaseUrl('link', false).ltrim($alias, '/');
    }

    return Mage::getBaseUrl('link', false).ltrim($request->getPathInfo(), '/');
}

4
非常感谢上面的提示。我将代码集成到了“类似于Magento的模块”中,而没有过载核心。
只需要创建三个文件:
app/code/local/MyCompany/MyModule/Controller/Varien/Router/Standard.php
app/code/local/MyCompany/MyModule/etc/config.xml
app/etc/modules/MyCompany_MyModule.xml

app/etc/modules/MyCompany_MyModule.xml 中粘贴以下无聊的内容:
<?xml version="1.0"?>
<config>
    <modules>
        <MyCompany_MyModule>
            <active>true</active>
            <codePool>local</codePool>
        </MyCompany_MyModule>
    </modules>
</config>

app/code/local/MyCompany/MyModule/etc/config.xml中粘贴路由配置:
<?xml version="1.0"?>
<config>
    <modules>
        <MyCompany_MyModule>
            <version>0.1.0</version>
        </MyCompany_MyModule>
    </modules>
    <default>
        <web>
            <routers>
                <standard>
                    <area>frontend</area>
                    <class>MyCompany_MyModule_Controller_Varien_Router_Standard</class>
                </standard>
            </routers>
        </web>
    </default>
</config>

app/code/local/MyCompany/MyModule/Controller/Varien/Router/Standard.php 中实现上述逻辑:

<?php

class MyCompany_MyModule_Controller_Varien_Router_Standard extends Mage_Core_Controller_Varien_Router_Standard {

    protected function _checkShouldBeSecure($request, $path='') {
       parent::_checkShouldBeSecure($request, $path);

       if (!$this->_shouldBeSecure($path) && Mage::app()->getStore()->isCurrentlySecure()) {
            $url = $this->_getCurrentUnsecureUrl($request);

            Mage::app()->getFrontController()->getResponse()
            ->setRedirect($url)
            ->sendResponse();
            exit;
        }
    }

    protected function _getCurrentUnsecureUrl($request) {
        if ($alias = $request->getAlias(Mage_Core_Model_Url_Rewrite::REWRITE_REQUEST_PATH_ALIAS)) {
            return Mage::getBaseUrl('link', false).ltrim($alias, '/');
        }

        return Mage::getBaseUrl('link', false).ltrim($request->getPathInfo(), '/');
    }
}

很遗憾,没有事件可以观察到解决问题... 但是覆盖路由器比(技术上)替换更好(用于更新)。


1
上面的代码从请求中删除了查询字符串,两个函数都应该被修改为在重定向之前将其添加到请求中。
请参见下文:
$querystring = $_SERVER['QUERY_STRING'];

return Mage::getBaseUrl('link', false).ltrim($request->getPathInfo(), '/').($querystring ? '?'.$querystring : '');

1

如需进一步了解,请查看以下内容

检查如何解决自定义模块前端URL被强制为https而不是http的问题。如果您使用模块创建器创建模块,则一定会在config.xml中找到以下代码

<admin>
       <routers>
         <[ModuleName]>
            <use>admin</use>
            <args>
                <module>[NameSpace_ModuleName]</module>
                <frontName>[frontName]</frontName>
            </args>
        </[ModuleName]>
    </routers>
</admin>

为了解决重定向到https而不是http的问题,您需要在模块config.xml文件路径中注释上述代码:app/code/(codepool)/(NameSpace)/(ModuleName)/etc/config.xml。或者,您可以为和路由器添加不同的“frontName”。例如:
<admin>
       <routers>
         <[ModuleName]>
            <use>admin</use>
            <args>
                <module>[NameSpace_ModuleName]</module>
                <frontName>[frontName]</frontName>
            </args>
        </[ModuleName]>
    </routers>
</admin>

<frontend>
       <routers>
         <[ModuleName]>
            <use>standard</use>
            <args>
                <module>[NameSpace_ModuleName]</module>
                <frontName>[frontName1]</frontName>
            </args>
        </[ModuleName]>
    </routers>
</frontend>

根据上述代码,管理员网址将为http://yourdomain.com/index.php/frontName/adminhtml_moduleName/,前端网址将为http://yourdomain.com/index.php/frontName1
我希望以上内容对您有用。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接