WordPress PHP редирект с использованием Regex Wildcard - PullRequest
0 голосов
/ 08 февраля 2019

Это для проекта.Мне нужно перенаправить определенные входящие URL-запросы на файлы, размещенные на том же веб-сервере.Я не могу использовать .htaccess и не могу положиться на какие-либо плагины.

Мне удалось сделать это с помощью плагина, но я с трудом извлекаю необходимый код для написания своего собственного плагина, который делает то, что мне нужно делать в жестком коде.

  • WordPress Multisite
  • Все программное обеспечение обновлено

  • «Перенаправление» Плагин 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?

Любая помощь будет очень полезна.

Спасибо, Даниэль

1 Ответ

0 голосов
/ 08 февраля 2019

Если вы предпочитаете сохранить логику кода и просто заставить код работать, попробуйте следующее:

$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'], '?' );
}

Вы можете изменить правило перенаправления по своему усмотрению.Он работает как обычный шаблон Regex.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...