WP_HOME和WP_SITEURL中的WP-CONFIG动态主机名

时间:2016-04-05 作者:CandyCoated

使用以下代码在WP中设置WP\\U HOME和WP\\U SITEURL是否有任何缺点。单站点安装和多站点安装的配置:

/**
* Site Host URLs
*/

$hostname = $_SERVER[\'HTTP_HOST\'];
if(isset($_SERVER[\'HTTP_X_FORWARDED_HOST\']) && !empty($_SERVER[\'HTTP_X_FORWARDED_HOST\'])) {
    $hostname = $_SERVER[\'HTTP_X_FORWARDED_HOST\'];
}

$protocol = isset($_SERVER[\'HTTPS\']) 
                && ($_SERVER[\'HTTPS\'] == \'on\' 
                || $_SERVER[\'HTTPS\'] == 1)
            || isset($_SERVER[\'HTTP_X_FORWARDED_PROTO\'])
                && $_SERVER[\'HTTP_X_FORWARDED_PROTO\'] == \'https\'
            ? \'https://\'
            : \'http://\';

$siteUrl = $protocol . rtrim($hostname, \'/\');

define(\'WP_HOME\', $siteUrl);
define(\'WP_SITEURL\', $siteUrl);
我知道我没有什么悬赏的名声,但你的回答会得到我百分之百的赞赏。

3 个回复
最合适的回答,由SO网友:Mark Kaplun 整理而成

明显的问题是您信任用户输入(http头),这使得您的代码在安全POV中可疑。

除此之外,它没有真正的问题,但我的经验是,这种黑客倾向于将您试图以这种方式解决的任何问题转移到另一个地方。

SO网友:incredimike

多年来,我在许多CMS项目中使用了类似的方法。它对于快速开发非常有效,但确实存在一些问题。

如果您可以相信web服务器(apache、nginx)配置正确,那么可以使用$_SERVER[\'SERVER_NAME\'] 检索Web服务器配置的主机名。(参考:https://stackoverflow.com/questions/2297403/http-host-vs-server-name)

也就是说,HTTP\\U主机当然更灵活!

如果我不能控制服务器配置,我通常会指定一组可以设置的“允许的”主机,以及一个合理的默认值。例如:

/**
* Site Host URLs
*/

$hostname = $_SERVER[\'HTTP_HOST\'];
if(!empty($_SERVER[\'HTTP_X_FORWARDED_HOST\'])) {
    $hostname = $_SERVER[\'HTTP_X_FORWARDED_HOST\'];
}

$hostname = rtrim($hostname, \'/\');

$allowed = [\'www.foo.com\', \'dev.foo.com\', \'staging.foo.com\'];

if (!in_array($hostname, $allowed)) {
    $hostname = \'www.foo.com\';
}

$protocol = (!empty($_SERVER[\'HTTPS\']) || !empty($_SERVER[\'HTTP_X_FORWARDED_PROTO\'] == \'https\'))
            ? \'https://\'
            : \'http://\';

$siteUrl = $protocol . $hostname;

define(\'WP_HOME\', $siteUrl);
define(\'WP_SITEURL\', $siteUrl);

SO网友:Marttin Notta

据我所知(2年wordpress/woocommerce),我一直使用WP\\U HOME和WP\\U SITEURL。使网站从一个域移动到另一个域变得非常容易,即使在移动电子商务商店时也从未遇到过任何问题。您可能希望转到管理面板并在那里保存永久链接,以便在DB中更新它们,但通常不需要这样做。

NB! 它不会更新已保存到数据库的任何类型的链接(a、img src等)。例如,如果您在domainA上有博客。com中,您已经通过WYSIWYG编辑器插入了图像,现在您将移动到domainB。com,则您博客内容中的所有图像仍将尝试从domainA加载。com。这是因为所见即所得保存了全长链接,即使它们是从您自己的域到数据库的链接。如果您有这样的内容,则必须对该数据库执行搜索和替换。

目前我没有想到更多的问题,但如果我记得什么,我会更新这篇文章。

Edit

正如Mark已经提到的,信任存在安全风险

$_SERVER[\'HTTP_X_FORWARDED_HOST\']
因为用户可以轻松地自己设置标题。