2010-01-20 56 views
0

也許對一些人來說可能並不棘手,但對我來說很棘手。棘手的PHP正則表達式問題

我最近在我的博客上移動了一些東西,我需要輕鬆地將用戶重定向到新頁面。

以前,我有我的所有文章的鏈接,像這樣:

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

但我把它改爲:

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

我想重定向用戶訪問「博客/我的-article-title「改爲」blog/article/my-article-title「。

棘手的部分是,我有其他部分到我的博客,如檔案和搜索,其網址是「博客/檔案」或「博客/搜索」。正如您可能已經想到的那樣,需要一個更智能的解決方案,以便查找我的存檔頁面的用戶不會被轉發到名爲「存檔」的不存在的文章。

任何幫助?

回答

4

這是在比PHP .htaccess文件來實現更好;和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中它要複雜得多,並且還需要啓動一個解釋器來完成服務器可以完成的任務,所以如果您有選擇,請避免這種方式。

+0

謝謝你,這個解決方案的工作原理 – jeff1234567890 2010-01-20 15:32:21

6

你想使用mod_rewrite(或您的網絡服務器等效),而不是PHP的。

0

可以使用負前瞻,就像這樣:

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