我有一个托管在Azure应用服务(不是专用虚拟机)上的WordPress网站,我需要有人通过以下网址访问首页:http://www.example.com/?tracking.id=12345
但是,WordPress正在重写网址,方法是将tracking.id
中的点替换为下划线:http://www.example.com/?tracking_id=12345
如何防止WordPress这样做?
答案 0 :(得分:1)
有趣的是,这只发生在主页上,查询变量在其他地方保持不变。如果您查看wp-includes/canonical.php
(这也是redirect_canonical
过滤器所在的位置),您或许可以弄清楚发生了什么。
function prevent_underscores( $redirect_url, $requested_url ) {
if( isset( $_GET['tracking_id'] ) ) {
return $requested_url;
}
return $redirect_url;
}
add_filter( 'redirect_canonical', 'prevent_underscores', 10, 2 );
答案 1 :(得分:0)
您可以检查是否已选择并在WordPress网站的设置标签中设置(->)
。有关详细信息,请参阅https://codex.wordpress.org/Using_Permalinks。
此外,您可以利用第三部分Wordpress插件,参考https://wordpress.org/plugins/custom-permalinks/。
答案 2 :(得分:0)
@vidja与redirect_canonical
的距离非常近,而且绝对正确。
我自己进一步研究了这个问题,以了解这是PHP本身与WordPress中的此重定向逻辑之间的问题的组合。如果直接查看php全局$_GET
,您会发现这是“错误地”解析查询字符串参数的地方。例如:
// For a url like: /some/path/?tracking.id=123
var_dump($_GET);
// array(1) { ["tracking_id"]=> string(3) "123" }
如果继续研究redirect_canonical
代码,您将最终发现罪魁祸首是一堆函数调用,以php的parse_str
方法结尾:
// https://developer.wordpress.org/reference/functions/_remove_qs_args_if_not_in_url/
_remove_qs_args_if_not_in_url()
// https://developer.wordpress.org/reference/functions/remove_query_arg/
remove_query_arg()
// https://developer.wordpress.org/reference/functions/add_query_arg/
add_query_arg()
// https://developer.wordpress.org/reference/functions/wp_parse_str/
wp_parse_str()
// https://www.php.net/manual/en/function.parse-str.php
parse_str()
直接测试parse_str
可得到与查看$ _GET相同的结果:
$arr = [];
parse_str('tracking.id=123', $arr);
var_dump( $arr );
// array(1) { ["tracking_id"]=> string(3) "123" }
所有这一切都表明,有一种更好的方法来设置自己的过滤器,以便获得更可靠的结果。例如,@ vidja编写其过滤器的方式将导致页面在您希望被重定向时无法正确重定向(因此,WordPress显示未找到404的页面)。假设您有一个页面上有/sample-page
的页面,并且您尝试通过类似/sampl?tracking.id=123
的URL访问站点。 Wordpress希望将其重定向到/sample-page/?tracking_id=123
,但是@vidja的代码将返回原始(错误的)URL,因为tracking_id
是在$ _GET中设置的。因此,在我看来,一种更好的解决方法是替换您在重定向URL中关心的特定查询字符串参数,这样Wordpress可以按照自己认为合适的方式重定向页面,但您也可以维护您的tracking.id
正确。如下所示:
add_filter( 'redirect_canonical', function ( $redirect_url, $requested_url ) {
return preg_replace( '/tracking_id=/', 'tracking.id=', $redirect_url );
}, 10, 2 );
如果您需要维护多个带有周期的查询字符串参数,甚至可以执行以下操作:
add_filter( 'redirect_canonical', function ( $redirect_url, $requested_url ) {
$query_params = [
'tracking_id' => 'tracking.id',
'foo_bar' => 'foo.bar',
];
foreach ( $query_params as $search => $replace ) {
$redirect_url = preg_replace( '/'.$search.'=/', $replace.'=', $redirect_url );
}
return $redirect_url;
}, 10, 2 );