Проверка PHP в функции для перенаправления URL-адреса без косой черты в URL-адрес с косой чертой - PullRequest
0 голосов
/ 07 апреля 2019

У меня есть функция, которая контролирует содержимое Wordpress с нумерацией страниц и перенаправляет пронумерованные URL-адреса на родительский URL-адрес.

Функция работает отлично, но я хочу, чтобы перенаправление 301 для пронумерованных URL-адресов, которые не имеют конечной косой черты, запускается непосредственно на косую черту URL. Например:

https://www.example.com/how-to-do-something/1111

следует немедленно перенаправить на

https://www.example.com/how-to-do-something/

В данный момент вместо этого работает перенаправление 301, но передается https://www.example.com/how-to-do-something, а затем https://www.example.com/how-to-do-something/.

Но, в то же время , эта проверка не должна делать недействительными нумерованные URL-адреса с окончательной косой чертой, которые уже хороши, например:

https://www.example.com/how-to-do-something/1111/ отлично перенаправить на https://www.example.com/how-to-do-something/ за один выстрел. Так что для них ничего не поделаешь.

функция следующая:

global $posts, $numpages;

 $request_uri = $_SERVER['REQUEST_URI'];

 $result = preg_match('%\/(\d)+(\/)?$%', $request_uri, $matches);

 $ordinal = $result ? intval($matches[1]) : FALSE;

 if(is_numeric($ordinal)) {

     // a numbered page was requested: validate it
     // look-ahead: initialises the global $numpages

     setup_postdata($posts[0]); // yes, hack

 $redirect_to = isset($ordinal) ? '/': (($ordinal > $numpages) ? "/$numpages/" : FALSE);

     if(is_string($redirect_to)) {

         // we got us a phantom
         $redirect_url = get_option('home') . preg_replace('%'.$matches[0].'%', $redirect_to, $request_uri);

         // redirect to it's parent 301
             header($_SERVER['SERVER_PROTOCOL'] . ' 301 Moved Permanently');

         header("Location: $redirect_url");
         exit();

     }
 }

Как я могу добиться этого Проверка PHP от URL-адреса без конечной косой черты непосредственно до конечной косой черты без вызывает правило htaccess, которое я должен заставить косую черту? Спасибо за ваше терпение и время.

Ответы [ 2 ]

0 голосов
/ 07 апреля 2019

Снова глядя на ваш код, есть некоторые вещи, которые не складываются:

  1. Строка $redirect_to = isset($ordinal) ? '/': (($ordinal > $numpages) ? "/$numpages/" : FALSE); всегда будет возвращать '/', поскольку $ ordinal всегда устанавливается в операторе if.

  2. Возвращает ли опция 'home' URL с косой чертой? чтобы убедиться, что вам нужна функция 'trailingslashit', то есть trailingslashit(get_option('home'))

  3. В целом я бы подошел к этому немного по-другому. Это то, что я бы сделал (заполните, чтобы изменить его в соответствии с вашими потребностями):

$request_uri = $_SERVER['REQUEST_URI'];

$uriParts = explode('/', trim($request_uri, '/'));

$ordinal = array_pop($uriParts);

if (is_numeric($ordinal)) {
  setup_postdata($posts[0]);
  $redirect_url = trailingslashit(get_option('home')) . implode('/', $uriParts) . '/';
  header($_SERVER['SERVER_PROTOCOL'] . ' 301 Moved Permanently');
  header("Location: $redirect_url");
  exit();
}

Надеюсь, это поможет.

0 голосов
/ 07 апреля 2019

Wordpress имеет функцию, которая добавляет косую черту:

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