【问题标题】:Redirect https to http on non secure magento pages在非安全 magento 页面上将 https 重定向到 http
【发布时间】:2015-04-15 17:02:17
【问题描述】:

Magento 有一些很棒的内置功能,如果您请求一个应该安全的页面,例如通过http结帐然后它重定向到https。然而,似乎缺少的是如果有人请求一个不需要安全的页面,例如通过 https 的类别页面然后似乎没有将它们重定向到 http 的功能。

所以如果有人要求:

https://www.mysite.com/mycategory

他们将 301 重定向到

http://www.mysite.com/mycategory

有人设法做到这一点吗?

如果没有,那么任何人都能够指出我执行重定向到 HTTPS 的 magento 核心代码的方向,然后我应该能够从中工作以提出解决方案。

【问题讨论】:

    标签: magento


    【解决方案1】:

    看看下面的方法

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

    【讨论】:

    • 干杯富人刚刚发现。
    【解决方案2】:

    感谢 Rich 我在 app/code/core/Mage/Controller/Varien/Router/Standard.php::_checkShouldBeSecure() 中追踪到了这个

    我在 elseif 部分修改了这个函数(在 app/code/local 中创建的副本添加在那里修改)添加

    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(), '/');
    }
    

    【讨论】:

      【解决方案3】:

      非常感谢上面的提示。我将代码集成到“类似 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(), '/');
          }
      }
      

      不幸的是,没有观察到哪个事件解决了问题...但是覆盖路由器(更新)比(技术上)替换更好。

      【讨论】:

        【解决方案4】:

        更多知识请通过以下方式

        检查如何解决自定义模块前端 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>
        

        根据上面的代码管理 url 将是 http://yourdomain.com/index.php/frontName/adminhtml_moduleName/ 和前端 url 将像:http://yourdomain.com/index.php/frontName1

        希望以上内容对你有用。

        【讨论】:

          【解决方案5】:

          上面的代码从请求中去除了查询字符串,这两个函数都应该被改变以在重定向之前将其添加到请求中。

          见下文:

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

          【讨论】:

            猜你喜欢
            • 2013-04-09
            • 1970-01-01
            • 1970-01-01
            • 2012-12-26
            • 2015-08-08
            • 1970-01-01
            • 1970-01-01
            • 2011-05-01
            • 2013-10-18
            相关资源
            最近更新 更多