PHP检入一个函数来将非尾部斜杠URL重定向到尾部斜杠URL

时间:2019-04-07 11:18:15

标签: php wordpress .htaccess redirect

我有一个功能可以控制分页的Wordpress内容,并将带编号的URL重定向到其父URL。

该功能运行正常,但我希望没有最终斜杠的数字URL的重定向301直接触发到斜杠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 :(得分:0)

Wordpress具有添加斜杠的功能:

trailingslashit($string);

答案 1 :(得分:0)

再次查看您的代码,有些事情没有加起来:

  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();
}

希望这会有所帮助。