如果我们有一个名为technical
并尝试加载:
example.tld/technical/99999999999999999999
然后
99999999999999999999
零件被视为
page
值为的查询变量
2147483647
.
原因是页面的重写规则:
根据handy
Monkeyman Rewrite Analyzer 作者:简·法布里。
This part 的WP_Query::get_posts()
:
if ( isset($q[\'page\']) ) {
$q[\'page\'] = trim($q[\'page\'], \'/\');
$q[\'page\'] = absint($q[\'page\']);
}
负责整数转换,即。
absint( \'99999999999999999999\' ) = 2147483647
这实际上是
same as:
abs( intval( \'99999999999999999999\' ) )
我还测试了:
intval( 99999999999999999999 )
但这只是0。
我检查了PHP documentation 在…上intval()
也就是说:
最大值取决于系统。32位系统的最大有符号整数范围为-2147483648到2147483647。例如,在这样的系统上,intval(\'1000000000000\')将返回2147483647。64位系统的最大有符号整数值为9223372036854775807。
字符串很可能返回0,尽管这取决于字符串最左边的字符。整数转换的常见规则适用。
最后,规范重定向开始并重定向到:
example.tld/technical/2147483647/
您当前的重写规则:
add_rewrite_rule(
\'^technical/([0-9])/?\',
\'technical/?pid=$matches[1]\',
\'bottom\'
);
似乎是错的。例如,缺少
index.php
部分和仅支持单个数字。
解决方法
尝试例如(未测试):
add_rewrite_rule(
\'^technical/([0-9]+)/?\',
\'index.php?pagename=technical&wpseid=$matches[1]\',
\'top\'
);
add_filter( \'query_vars\', function( $qv )
{
$qv[] = \'wpseid\';
return $qv;
} );
我换衣服的地方
pid
到
wpseid
以避免可能的名称冲突。
现在您应该能够使用$wpseid = get_query_var( \'wpseid\' );
未经修改检索。
请注意,您很可能会失去对该页面进行内容分页的可能性。
。。。或者切换到64位系统,其中:
9223372036854775807 > 10101000003163
只需结合使用
is_page( \'technical\' )
和
get_query_var( \'page\' )
但这听起来是一个混乱的解决方案,所以我不推荐;-)