我回答了一个老问题,有人想去哪里remove the HTTP and HTTPS protocols from the URLs on their website:
add_action( \'plugins_loaded\', \'output_buffering\' );
function output_buffering() {
ob_start( \'remove_protocols\' ) );
}
function remove_protocols( $buffer ) {
$content_type = NULL;
foreach ( headers_list() as $header ) {
if (strpos( strtolower( $header ), \'content-type:\' ) === 0 ) {
$pieces = explode( \':\', strtolower( $header ) );
$content_type = trim( $pieces[1] );
break;
}
}
if ( is_null( $content_type ) || substr( $content_type, 0, 9 ) === \'text/html\' ) {
$return = preg_replace( \'~=\\s*["\\\']\\s*https?:(.*?)["\\\']~i\', \'="$1"\', $buffer );
if ( $return ) {
$buffer = $return;
}
}
return $buffer;
}
因此,它给出了以下内容:
<link rel=\'stylesheet\' id=\'some-id\' href=\'//example.com/some/style.css\' type=\'text/css\' media=\'all\' />
<script type=\'text/javascript\' src=\'//example.com/some/script.js\'></script>
<a href="//example.com" title="Some Title" rel="home">Some Link</a>
<img src="//example.com/some/image.jpg" alt="Some Alt" width="150" height="50" />
然而,我简化了
remove_protocols()
提供相同结果的函数:
function remove_protocols( $buffer ) {
$buffer = preg_replace( \'~=\\s*["\\\']\\s*https?:(.*?)["\\\']~i\', \'="$1"\', $buffer );
return $buffer;
}
在我最初的功能中,是否需要检查
content-type
在标题中?做一些研究,我发现
similar question on Stack Overflow 这取决于具体情况。通过阅读本文,我认为使用我的简化版本是安全的,但如果我理解正确,我希望得到确认。
最合适的回答,由SO网友:Mark Kaplun 整理而成
就这个问题而言,是的。如果不检查内容类型标题,您就不知道所提供的是html页面还是图像,虽然正则表达式不太可能与图像中的任何内容匹配,但存在风险。
编写代码的另一种方法是将其挂接template_redirect
甚至get_header
几乎百分之百地确定您处理的是html页面,而不是RSS、json、xml等,对于这些页面,URL转换可能不需要,甚至不受欢迎。
再看看原来的问题,显然你也希望它出现在管理页面中。。。因此,您最初的解决方案可能是最全面的解决方案。
OTOH,并且与这个问题不太相关,您可能会以替换太多而结束,比如规范url,这可能会产生重复内容的问题。