Перенаправление PHP PHP с подстановочным знаком Regex

Это для проекта. Мне нужно перенаправить определенные входящие запросы 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 успешно

перенаправляет на

/файлы/5/текст.xml


Однако некоторые входящие запросы содержат строку запроса, например.

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


очевидно, редирект с

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

к

/файлы/5/regex.xml

работает отлично.


Однако, как только задействована строка запроса, перенаправление не работает. Учитывая, что мне нужно сделать это с помощью PHP, как я могу добиться перенаправления с подстановочным знаком с /regex/* или /regex/wildcard.xml* на /files/5/regex.xml?

Любая помощь будет принята с благодарностью.

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

Попробуйте эту статью один раз stackoverflow.com/questions/768431/…

Harsh Khare 08.02.2019 10:35

Спасибо! К сожалению, я не думаю, что это действительно относится к моей проблеме. По сути, все, что мне нужно, это выяснить, как сформулировать подстановочный знак в php: '/regex/wildcard.xml(.*)' => '/files/' . $блог_id . '/regex.xml',

Daniel Slyman 08.02.2019 10:42

Если это поможет, вот как мне удалось это сделать с помощью плагина: Howarddc.com/understanding-redirection-regular-expressions "Создание перенаправлений с подстановочными знаками"

Daniel Slyman 08.02.2019 10:43

Проверьте с помощью любого плагина перенаправления URL

Harsh Khare 08.02.2019 10:44

Написал им, пока ответа нет и просто по коду не могу понять.

Daniel Slyman 08.02.2019 11:46

Вы хотите перенаправить example.com/regex/wildcard.xml?somequerystring на example.com/files/5/regex.xml, пропустив строку запроса?

Djanym 08.02.2019 11:58

да именно так!

Daniel Slyman 08.02.2019 12:23
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
7
807
1

Ответы 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'], '?' );
}

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

Другие вопросы по теме