是的,对于以下情况我们应该具有相同的匹配项似乎很奇怪:
example.tld/2016/03/29/test/
和例如
example.tld/2016/03/29/..!!$$~~test~~!!$$../
为什么这是可能的,似乎是这部分中的WP_Query::get_posts()
方法:
if ( '' != $q['name'] ) {
$q['name'] = sanitize_title_for_query( $q['name'] );
其中sanitize_title_for_query()
定义为:
function sanitize_title_for_query( $title ) {
return sanitize_title( $title, '', 'query' );
}
应该可以使用sanitize_title
过滤器对此进行更严格的限制,但是最好不要覆盖基于的默认输出,该默认输出 sanitize_title_with_dashes
负责此处的卫生工作。如果没有关于此行为的最新消息,则应考虑创建票证而不是更改票证。
更新资料
我想知道我们是否可以清除当前路径中的噪声,sanitize_title_for_query()
并在必要时重定向到已清理的URL?
这是一个演示,可以在测试站点上播放并根据需要进行调整:
/**
* DEMO: Remove noise from url and redirect to the cleaned version if needed
*/
add_action( 'init', function( )
{
// Only for the front-end
if( is_admin() )
return;
// Get current url
$url = home_url( add_query_arg( [] ) );
// Let's clean the current path with sanitize_title_for_query()
$parse = parse_url( $url );
$parts = explode( '/', $parse['path'] );
$parts = array_map( 'sanitize_title_for_query', $parts );
$path_clean = join( '/', $parts );
$url_clean = home_url( $path_clean );
if( ! empty( $parse['query'] ) )
$url_clean .= '?' . $parse['query'];
// Only redirect if the current url is noisy
if( $url === $url_clean )
return;
wp_safe_redirect( esc_url_raw( $url_clean ) );
exit;
} );
最好sanitize_title_with_dashes()
直接使用以避免过滤器并更换:
$parts = array_map( 'sanitize_title_for_query', $parts );
与:
foreach( $parts as &$part )
{
$part = sanitize_title_with_dashes( $part, '', 'query' );
}
ps:我想我学到了这个技巧,可以add_query_arg( [] )
从@gmazzap 获得空的当前路径;-) 法典中也提到了这一点。再次感谢@gmazzap esc_url()
在显示add_query_arg( [] )
或esc_url_raw()
重定向输出时提醒使用。还要检查以前的食典参考。