【问题标题】:Tricky PHP regex problem棘手的 PHP 正则表达式问题
【发布时间】:2011-01-07 03:24:40
【问题描述】:

也许对某些人来说并不棘手,但对我来说却很棘手。

我最近在我的博客上移动了一些东西,我需要轻松地将用户重定向到新页面。

以前,我的所有文章都是这样链接的:

http://www.my-site.com/blog/my-article-title

但是我把它改成了:

http://www.my-site.com/blog/article/my-article-title

我想将访问“blog/my-article-title”的用户重定向到“blog/article/my-article-title”。

棘手的部分是我的博客还有其他部分,例如存档和搜索,其 URL 是“blog/archives”或“blog/search”。正如您可能已经想到的那样,需要一个更智能的解决方案,这样寻找我的档案页面的用户就不会被转发到名为“档案”的不存在的文章。

有什么帮助吗?

【问题讨论】:

    标签: php regex


    【解决方案1】:

    这在你的 .htaccess 文件中比 PHP 做得更好;和 Jamie Zawinski 的名言,如果你使用正则表达式会遇到两个问题。 .htaccess 需要最少的正则表达式,而 PHP 则不需要。

    RewriteCond $1 !^(archives|search)
    RewriteRule blog/(.*) http://www.my-site.com/blog/article/$1 [R=301]
    

    或者,如果您有 RedirectMatch 可用,您可以将它与已经建议的否定前瞻结合起来:

    RedirectMatch permanent blog/((?!archives|search).+) http://www.my-site.com/blog/article/$1
    

    如果需要使用PHP:

    $urlparts = explode('/', $_SERVER['REQUEST_URI']);
    
    if ( ! in_array($urlparts[1], array('archives', 'search')) ) {
        $url = 'http://www.my-site.com/blog/article/' . $urlparts[2]
        header('HTTP/1.1 301 Moved Permanently');
        header("Location: $url");
        exit;
    }
    

    如您所见,在 PHP 中它要复杂得多,并且还需要启动解释器来执行服务器可以完成的操作,因此如果您可以选择,请避免使用这种方式。

    【讨论】:

      【解决方案2】:

      您可以使用负前瞻,如下所示:

      blog/((?!archives|search).+)
      

      【讨论】:

        【解决方案3】:

        您想为此使用mod_rewrite(或您的网络服务器等效项)而不是 php。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2020-03-12
          • 1970-01-01
          • 1970-01-01
          • 2011-10-17
          • 2017-03-18
          • 2011-11-07
          相关资源
          最近更新 更多