如何防止页面查询变量的值更大时重定向到最大值2147483647?

时间:2016-05-23 作者:Roi

我有一个身份证10101000003163

我将其设置为my href as"technical/10101000003163/"

但WordPress将我重定向到"technical/2147483647/"

我怎样才能阻止WordPress这样做?

我的重写规则是

function rewrite_technical() {
  add_rewrite_rule(\'^technical/([0-9])/?\', \'technical/?pid=$matches[1]\', \'bottom\');
}
add_action(\'init\', \'rewrite_technical\');

1 个回复
最合适的回答,由SO网友:birgire 整理而成

如果我们有一个名为technical 并尝试加载:

example.tld/technical/99999999999999999999
然后99999999999999999999 零件被视为page 值为的查询变量2147483647.

原因是页面的重写规则:

rewrite rules

根据handyMonkeyman Rewrite Analyzer 作者:简·法布里。

This partWP_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;
} );
我换衣服的地方pidwpseid 以避免可能的名称冲突。

现在您应该能够使用$wpseid = get_query_var( \'wpseid\' ); 未经修改检索。

请注意,您很可能会失去对该页面进行内容分页的可能性。

。。。或者切换到64位系统,其中:

9223372036854775807 > 10101000003163
只需结合使用is_page( \'technical\' )get_query_var( \'page\' ) 但这听起来是一个混乱的解决方案,所以我不推荐;-)

相关推荐

Altered Media Library URLs

我有一个客户的网站,是在他们离开另一家代理机构后我找到的。该机构使用了一个专有主题和自己的自托管页面生成器,以防止其在除他们之外的任何其他托管环境中更新或编辑。它的另一个方面是重新映射主题的URL并上载目录。因此,例如,代替WP在中查找主题文件http://domain.com/wp-content/themes/…. 它在里面找他们http://domain.com/t/….同样,对于图像上载,也可以在http://domain.com/wp-content/uploads/…, 它在里面找他们http