2

我正在尝试使用 Wordpress 的内置 SimplePie 加载 RSS 提要。

include_once(ABSPATH . WPINC . '/feed.php');
$rssURL = 'http://missionstkitts.blogspot.com//feeds/posts/default';
$rss = fetch_feed($rssURL);

为了调试,我使用了 print_r($rss); 我得到一个 WordPress 错误对象:

WP_Error Object
(
    [errors] => Array
        (
            [simplepie-error] => Array
                (
                    [0] => WP HTTP Error: A valid URL was not provided.
                )

        )

    [error_data] => Array
        (
        )

)

但是,令人沮丧的是,如果我打印 $rssURL 然后复制并粘贴它,它会直接进入正确的提要。到底是怎么回事?

4

3 回答 3

4

由于这是谷歌的第一次点击,可能值得我添加这个可能的解决方案:

对于我们的实例 - 一个 Intranet 站点,从另一个内部页面提取 rss 提要,该提要又解析为 RFC1918 私有地址,该提要因安全原因被 Wordpress 的 URL 检查器阻止。

在我的实例中,最简单的解决方法是将以下内容添加到 functions.php 中,但这确实具有安全隐患,因此请确保在添加之前了解它:

add_filter( 'http_request_args', function( $args ) {
   $args['reject_unsafe_urls'] = false;
   return $args;
} );

进一步讨论和更多信息 - https://core.trac.wordpress.org/ticket/24646

于 2014-01-08T17:21:15.493 回答
1

通过为特定的 url 添加 preg_match,我们可以最小化解析的不安全 url 的数量:

function http_request_local( $args, $url ) {
   if ( preg_match('/xml|rss|feed/', $url) ){
      $args['reject_unsafe_urls'] = false;      
   }
   return $args;
}
add_filter( 'http_request_args', 'http_request_local', 5, 2 );
于 2018-01-04T13:13:00.630 回答
0

因此,虽然上述答案有效,但我认为有一种方法可以更好地确保您限制发出 URL 请求的范围,而不是允许一切进行。因此,我向任何偶然发现此信息的人证明以下信息,以防万一。

如果结果调用是对在私有 IP 上交叉通信但仍可公开访问的内部服务器的调用,则此答案很有用。

下面的代码片段将在调用 RSS 提要的站点上运行。提供提要的站点不需要这个。

add_filter('http_request_host_is_external', function($bool, $host, $url){
        if($url === 'https://www.example.com/news/feed/' && $host === 'www.example.com'){
                return true;
        }
}, 10, 3);
于 2019-10-04T19:42:36.407 回答