【问题标题】:How do you prevent WordPress on Azure from changing dots to underscores in the URL?如何防止 Azure 上的 WordPress 将 URL 中的点更改为下划线?
【发布时间】:2020-08-07 04:01:35
【问题描述】:

我有一个托管在 Azure 应用服务(不是专用 VM)上的 WordPress 网站,我需要人们通过如下 URL 访问首页:http://www.example.com/?tracking.id=12345

然而,WordPress 正在重写 URL,将tracking.id 中的点替换为下划线:http://www.example.com/?tracking_id=12345

如何防止 WordPress 这样做?

【问题讨论】:

  • 看来我尝试过的许多技巧(例如更改 $config['uri_protocol'] )似乎不适用于 Azure 应用程序。
  • 不一定如何,但this 解释了原因。其中一种解决方法可能对您有用。
  • 我需要追踪重定向本身发生的位置。我发现正在使用一个名为“wp_safe_redirect”的函数,但没有在哪里编辑该函数的代码(考虑到名称的 wp_ 扩展名,我认为这不是 PHP 的内置功能)。我什至不确定我是否以正确的方式接近它。 (我不是 PHP 开发人员,所以我就像一个试图修复遗留错误的初级程序员一样陷入困境。)

标签: php wordpress azure


【解决方案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 );

【讨论】:

  • 听起来你可能在这个正确的轨道上。今晚我会进一步调查。
【解决方案2】:

您可以在您的 WordPress 网站的设置选项卡中检查您是否选择并设置了permalinks_type。详情可以参考https://codex.wordpress.org/Using_Permalinks

此外,您可以利用第三部分 Wordpress 插件,请参阅https://wordpress.org/plugins/custom-permalinks/

【讨论】:

  • 这似乎对重命名查询字符串参数时的自动重定向没有任何影响。如果我不得不猜测,它与this 有关,但我不确定它在代码中的哪个位置被剥离并更改了 URL。
【解决方案3】:

@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 not found 页面)。假设您有一个带有/sample-page slug 的页面,并且您尝试通过以下网址访问您的网站:/sampl?tracking.id=123。 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 );

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-05-23
    • 2013-12-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-01-05
    • 2017-06-27
    相关资源
    最近更新 更多