2012-02-06 227 views
4

如果你去像這樣的網址:http://stackoverflow.com/questions/9155602/地址欄將更新到http://stackoverflow.com/questions/9155602/redirect-existing-file-to-different-url-using-mod-rewrite。這不是用JavaScript完成的,也不是用硬刷新完成的,我最好的猜測是它使用mod_rewrite完成;然而,它如何知道沒有服務器端處理與PHP文章的標題?如何重寫SEO友好的網址,如stackoverflow

我剛剛更新我的網站使用SEO友好的網址,它曾經是/shows.php?id=review-1,現在它的/review/1/super-baseball-2020。在最後的文本實際上並沒有真正的問題,當涉及到我的改寫是:

RewriteCond %{REQUEST_FILENAME} !-f 
RewriteCond %{REQUEST_FILENAME} !-d 
RewriteRule ^([a-z0-9]+)/([0-9]+)/([a-z0-9-]+)?/?$ /shows.php?id=$1-$2 [L,NC] 

我現在要確保谷歌不會打我重複的內容,以及書籤正確轉發的路徑如下:

RewriteCond %{THE_REQUEST} ^GET\s/shows\.php\? 
RewriteCond %{QUERY_STRING} (?:^|&)id=review-1(?:&|$) [NC] 
RewriteRule^/review/1/super-baseball-2020/? [R=301,L,NC] 
RewriteCond %{THE_REQUEST} ^GET\s/shows\.php\? 
RewriteCond %{QUERY_STRING} (?:^|&)id=review-2(?:&|$) [NC] 
RewriteRule^/review/2/aero-fighters-2/? [R=301,L,NC] 
RewriteCond %{THE_REQUEST} ^GET\s/shows\.php\? 
RewriteCond %{QUERY_STRING} (?:^|&)id=review-3(?:&|$) [NC] 
RewriteRule^/review/3/aero-fighters-3/? [R=301,L,NC] 
.... and so on .... 

該解決方案是非常短視的,是成千上萬的行放入我的.htaccess。

+0

我懷疑這個功能是使用'mod_rewrite'完成的。會發生什麼情況是,對stackoverflow.com/*anything*的任何請求都由相同的服務器端代碼處理,然後解析該URL並*路由*請求代碼以使用問題ID爲頁面提供內容。問題標題被服務器忽略,請嘗試訪問http://stackoverflow.com/questions/9168364/bouncing-fluffy-muffins – millimoose 2012-02-06 22:46:03

+1

通常mvc應用程序將路由所有輸入的請求到相同的腳本(前端控制器),這將解析請求自己,並將操作委託給正確的控制器類。 – dqhendricks 2012-02-06 22:52:23

回答

3

它如何知道沒有服務器端的文章標題 用php處理?

mod_rewrite只能做這麼多。另外,你必須更新它太多。最好用腳本處理這些請求。創建.htaccess,類似於你做了什麼:

<IfModule mod_rewrite.c> 
RewriteEngine On 
#RewriteBase/
RewriteCond %{REQUEST_FILENAME} !-f 
RewriteRule ^(.*)$ /index.php [QSA,L] 
</IfModule> 
index.php

然後,分裂REQUEST_URI解析出/review/1/,查看數據庫的審查與1 id稱號,通過它添加到友好的URI(slug)函數中,並將其附加到url,然後重定向。

2

我也爲我們的節目創建了一個SEO友好的URL解決方案。 URL自然是/raido/episode.php?SeriesId=1 & EpisodeId = 123,但我也想/radio/1-123-live.htm,所以我的.htaccess看起來像這樣:

RewriteRule^\ d {1,3} - \ d {1,4}(+)。html $進行episode.php彈頭= $ 0

我然後讓目標頁面處理它

if ($Slug !== "") { 
    $lIds = explode("-", $Slug); 
    $SeriesId=$lId[0]; 
    $EpisodeId=$lIds[1]; 
} 

這也可以讓你?繼續接受現有鏈接,而不必擁有相同代碼的兩個版本。

0

您可能需要在應用程序本身中執行此操作,方法是根據所需位置的絕對URL檢查URL,或者每次添加新的「頁面」時按generating the mapping

3

對於重複的內容,您應該在頭部有一個規範鏈接標記。規範鏈接標籤會告訴谷歌當前頁面與規範鏈接有相同內容的替代網址,並且該內容的主要網址是規範鏈接。這對分頁內容,搜索等內容很有用,例如,同一頁面可能有不同的網址。

<link rel="canonical" href="http://www.somedomain.com/mainurl" /> 
2

,如果我做了

curl -I http://stackoverflow.com/questions/9155602/ 

其實我得到一個硬重定向:

HTTP/1.1 301 Moved Permanently 
Cache-Control: public, max-age=60 
Content-Length: 0 
Content-Type: text/html 
Expires: Mon, 06 Feb 2012 22:43:27 GMT 
Last-Modified: Mon, 06 Feb 2012 22:42:27 GMT 
Location: /questions/9155602/redirect-existing-file-to-different-url-using-mod-rewrite 
Vary: * 
Date: Mon, 06 Feb 2012 22:42:27 GMT 

通常這些設置包含一個簡短的.htaccess,迫使所有的請求要經過前端控制器,或者一個主要的index.php文件。這個文件檢查$ _SERVER ['PATH_INFO']變量並決定要拉入和渲染哪些內容。

這是一個簡單的.htaccess的例子(其實只是從一個香草WordPress的複製安裝):

RewriteEngine On 
RewriteBase/
RewriteRule ^index\.php$ - [L] 
RewriteCond %{REQUEST_FILENAME} !-f 
RewriteCond %{REQUEST_FILENAME} !-d 
RewriteRule . /index.php [L] 

在這個例子中,與硬重定向,他們可以有一個「其他」中的index.php ,如果根據最後一條PATH_INFO找不到內容,則進行查找並重定向。

+0

當我嘗試捲曲一個我知道使用301的網址時,它只是說200. http://www.defunctgames.com/shows.php?id=review-1。代碼:'RewriteCond%{THE_REQUEST}^GET \ s/shows \ .php \? RewriteCond%{QUERY_STRING}(^ |&)id = review- [0-9] +(&| $)[NC] RewriteRule^/controllers/redirectseo.php? [R = 301,L,NC,QSA]' – 2012-02-07 04:40:17