Magento 主机名验证错误

Mth*_*eti 4 email zend-framework magento

当我尝试在我正在开发的 magento 商店上注册电子邮件时,我遇到了我以前从未见过的错误:

"Email" is not a valid hostname

does not appear to be a valid local network name

appears to be a DNS hostname but cannot match TLD against known list magento
Run Code Online (Sandbox Code Playgroud)

当我进行研究时,我发现这些错误是由 Zend 主机名验证引起的。

是否有可能解决这些问题或根本没有解决方案

Dep*_*ell 6

我遇到了同样的错误:

"Email" is not a valid hostname.
'example.example' appears to be a DNS hostname but cannot match TLD against known list
'example.example' appears to be a local network name but local network names are not allowed
Run Code Online (Sandbox Code Playgroud)

从 Magento 1 来看,Zend 似乎正在使用 Tlds 的硬编码列表:

     /**
     * Array of valid top-level-domains
     *
     * @see ftp://data.iana.org/TLD/tlds-alpha-by-domain.txt  List of all TLDs by domain
     * @see http://www.iana.org/domains/root/db/ Official list of supported TLDs
     * @var array
     */
    protected $_validTlds = array(
        'ac', 'ad', 'ae', 'aero', 'af', 'ag', 'ai', 'al', 'am', 'an', 'ao', 'aq', 'ar', 'arpa',
        [...]
        'ye', 'yt', 'yu', 'za', 'zm', 'zw'
    );
Run Code Online (Sandbox Code Playgroud)

所以,有一些选择:


对于选项 2,我们可以对以下文件执行安全升级,或查看选项 3添加$validator->getHostnameValidator()->setValidateTld(false);,从 复制它:

/lib/Zend/Validate/Hostname.php

到 :

/app/code/local/Zend/Validate/Hostname.php

然后寻找这块代码,只注释三行:

if (!in_array($this->_tld, $this->_validTlds)) {
  // $this->_error(self::UNKNOWN_TLD);
  // $status = false;
  // break;
}
Run Code Online (Sandbox Code Playgroud)

对于选项 3,我们可以对以下文件执行安全升级,从以下位置复制它:

app/code/core/Mage/Eav/Model/Attribute/Data/Abstract.php

到 :

/app/code/local/Mage/Eav/Model/Attribute/Data/Abstract.php

然后替换此代码:

$validator = new Zend_Validate_EmailAddress();
Run Code Online (Sandbox Code Playgroud)

经过 :

// 1. we check mx record
$validator = new Zend_Validate_EmailAddress(
    array(
      'allow' => Zend_Validate_Hostname::ALLOW_DNS,
      'mx'    => true
    )
);
// 2. we remove TLD validation :
$validator->getHostnameValidator()->setValidateTld(false);
Run Code Online (Sandbox Code Playgroud)

不要忘记查找Zend_Validate_EmailAddress可以在社区或自定义扩展中使用的类的每个调用(例如:onestepcheckout)。