带有正则表达式通配符的 WordPress PHP 重定向

Posted

技术标签:

【中文标题】带有正则表达式通配符的 WordPress PHP 重定向【英文标题】:WordPress PHP Redirect with Regex Wildcard 【发布时间】:2019-07-02 11:41:41 【问题描述】:

这是一个项目。我需要将某些传入的 URL 请求重定向到托管在同一网络服务器上的文件。我不能使用 .htaccess 也不能依赖任何插件。

我设法用一个插件做到了这一点,但我很难提取必要的代码来编写我自己的插件来完成我需要做的硬编码。

WordPress 多站点

所有软件都是最新的

“重定向”WordPress 插件(成功)

编写自定义 WP 函数来执行此操作(半成功)

我在 Pantheon 文档中找到了一些代码:

$blog_id = get_current_blog_id();

// You can easily put a list of many 301 url redirects in this format
// Trailing slashes matters here so /old-url1 is different from /old-url1/
$redirect_targets = array(
  '/test/test.xml' => '/files/' . $blog_id . '/test.xml',
  '/regex/wildcard.xml(.*)' => '/files/' . $blog_id . '/regex.xml',     
);

if ( (isset($redirect_targets[ $_SERVER['REQUEST_URI'] ] ) ) && (php_sapi_name() != "cli") ) 
  echo 'https://'. $_SERVER['HTTP_HOST'] . $redirect_targets[ $_SERVER['REQUEST_URI'] ];
  header('HTTP/1.0 301 Moved Permanently');
  header('Location: https://'. $_SERVER['HTTP_HOST'] . $redirect_targets[ $_SERVER['REQUEST_URI'] ]);

  if (extension_loaded('newrelic')) 
    newrelic_name_transaction("redirect");
   
  exit();


https://example.com/test/test.xml成功

重定向到

/files/5/text.xml


但是,一些传入的请求包含查询字符串,例如

https://example.com/regex/wildcard.xml?somequerystring


显然,来自

的重定向

https://example.com/regex/wildcard.xml

/files/5/regex.xml

工作正常。


但是,一旦涉及查询字符串,重定向就不起作用。鉴于我需要使用 PHP 执行此操作,如何实现从 /regex/* 或 /regex/wildcard.xml* 到 /files/5/regex.xml 的通配符重定向?

任何帮助将不胜感激。

谢谢, 丹尼尔

【问题讨论】:

尝试这篇文章一次***.com/questions/768431/… 谢谢!不幸的是,我认为它并不真正适用于我的问题。本质上,我只需要找出如何在 php: '/regex/wildcard.xml(.*)' => '/files/' 中使用通配符。 $blog_id 。 '/regex.xml', 如果有任何帮助,这就是我使用插件设法做到的方式:howarddc.com/understanding-redirection-regular-expressions“创建通配符重定向” 检查任何 URL 重定向插件 我写信给他们,到目前为止没有回复,只是从代码中我无法弄清楚。 【参考方案1】:

如果您希望保留代码逻辑并让代码正常工作,那么试试这个:

$blog_id = get_current_blog_id();
$redirect_targets = array(
    '/wordpress\/test\/test\.xml/i' => 'files/'.$blog_id.'/test.xml',
    '/([^\/]+)\/([^\/]+)\.xml.*/i' => 'files/'.$blog_id.'/$1.xml',
);

// Get reuest uri without GET attributes.
$request_uri = get_request_uri();

// Loop through redirect rules.
foreach ($redirect_targets as $pattern => $redirect) 
    // If matched a rule, then create a new redirect URL
    if ( preg_match( $pattern, $request_uri ) ) 
        $new_request_uri = preg_replace( $pattern, $redirect, $request_uri );
        $new_url = 'https://'.$_SERVER['HTTP_HOST'].$new_request_uri;
        header( 'HTTP/1.0 301 Moved Permanently' );
        header( 'Location: '.$new_url );

        if ( extension_loaded( 'newrelic' ) ) 
            newrelic_name_transaction( "redirect" );
        
        exit();
    


// Returns REQUEST URI without 'get' arguments
// if example.com/test/test.php?some=arg it will return test/test.php
function get_request_uri () 
    return strtok( $_SERVER['REQUEST_URI'], '?' );

您可以根据需要修改重定向规则。它与普通的正则表达式模式一样工作。

【讨论】:

以上是关于带有正则表达式通配符的 WordPress PHP 重定向的主要内容,如果未能解决你的问题,请参考以下文章

php正则表达式

PHP 正则表达式

PHP的正则表达式

前端学PHP之正则表达式基础语法

前端学PHP之正则表达式基础语法

PHP 正则表达式