2013-04-06 51 views
8

我已經構建了我的網站的網址,例如堆棧 溢出網址。我的網址如下。堆棧溢出URL如何工作?

http://www.example.com/1255544/this-is-the-url-text 

在這個URL,1255544是id和this-is-the-url-text是URL標題文本,無論是存儲在數據庫中。我注意到,堆棧 溢出URL在id的基礎上工作。假設這裏是一個堆棧溢出  URL

http://stackoverflow.com/questions/15679171/new-way-to-prevent-xss-attacks 

在這個URL,15679171是帖子的ID。當我改變了這個ID來15706581而不觸及new-way-to-prevent-xss-attacks並按下Enter鍵,網址自動更改爲以下網址:

http://stackoverflow.com/questions/15706581/simplecursoradapter-does-not-load- 
external-sqlite-database-id-error 

,當我試圖刪除一些URL標題文本的部分像下面

http://stackoverflow.com/questions/15679171/new-way-to-preve 

它自動校正,如下的URL:

http://stackoverflow.com/questions/15679171/new-way-to-prevent-xss-attacks 

這意味着數據被從數據庫中檢索根據id爲15679171以及相關的URL標題文本new-way-to-prevent-xss-attacks

我也想這樣做。但問題是,我不明白如果有人更改URL的標識,標題文本應該自動更改。我該怎麼做呢?

我已經想好了以下內容:

$url_id = $_GET["id"]; 
$url_txt = $_GET["url_txt"]; 

$qry = "SELECT * FROM mytable WHERE url_id = '{$url_id}' LIMIT 1"; 
$data = mysql_query($qry); 
$data_set = mysql_fetch_array($data); 

if($url_txt== $data_set["url_txt"]) { 
    // proceed further 
} else { 
    $rebuilt_url = "http://www.example.com/" . $url_id . "/" . $data_set["url_txt"]; 
    header("Location: {$rebuilt_url}") // Redirect to this URL 
} 

是否執行此操作或不正確的和有效的方式?有解決方案嗎?

+1

當頁面加載,從您的數據庫通過id來獲取URL,它的URL從地址欄比較,如果它是不一樣的,然後重定向到正確的URL。 – 2013-04-06 04:54:48

+0

另外,小心sql注入(鑄造$ url_id到一個int應該做的伎倆)。 – 2013-04-06 05:04:44

+0

你好。您最近發佈了一個名爲「如何Stackoverflow問題解答系統工作」的問題,並由主持人將其遷移到錯誤的其他站點。哎呀,爲他們拍了':)'。我建議你重新發布它(使用複製和粘貼!),但稱它爲「如何優化我的類似StackOverflow的系統」。請記住,儘管您可能會在評論中發表一些一般性評論,但它可能會因爲太過鬆散而被封閉。如果你轉發,請在這裏(@halfer)給我打電話,我會發表評論。 – halfer 2013-04-07 19:11:13

回答

3

如果使用Apache,我想你一定知道URL rewriting

在URL重寫你的URL改寫爲一個更友好的樣子。看看下面的網址

http://www.downloadsite.com?category=34769845698752354

,當你在上面做一個URL重寫,變成這個樣子

http://www.downloadsite.com/Nettools/Messengers 

URL重寫需要在Apache的設置配置(重寫規則),以便在PHP解釋請求之前重寫您的URL,這樣您將獲得想要獲取的確切資源

RewriteRule ^/category$ /content.php 
    RewriteRule ^/category/([0-9]+)$ /.php?id=$1 
    RewriteRule 
    ^/category/([0-9]+),([ad]*),([0-9]{0,3}),([0-9]*),([0-9]*$) 
    cat.php?id=$1&sort=$2&order=$3&start=$4 

嗯,我不能在這裏解釋你的一切,但下面我提供了一些鏈接,你可以在這裏瞭解URL重寫。

這是您可以創建友好網址的最佳方法!

資源:

+3

嗨Mahan,Stack Overflow的習慣是在你的答案本身提供一個例子或解釋。這確保了三件事情:如果鏈接中斷,您的答案對未來的訪問者仍然有價值,並且它確保人們只需要在堆棧溢出時留下更深入的信息,而不會回答問題的答案。最後,你的例子可以定製,而鏈接可能是泛化。您可以使用此[編輯]鏈接進行添加。希望這可以幫助。 – jmort253 2013-04-06 04:58:02

+0

好吧,URL重寫有很多方法,每種方法都有很長的路要走,所以我只是把我在網上找到的一些最好的鏈接。那麼我會編輯我的答案 – 2013-04-06 05:02:20

+3

你不必顯示*每個*的可能性,但一個例子會阻止你的帖子被標記爲不是答案。此外,示例有助於人們學習並增加您的帖子獲得更多優惠的機會。祝你好運! :) – jmort253 2013-04-06 05:05:29

5

你的代碼看起來不錯,在我的一個堆棧 溢出答案我也建議類似的方法。不過,我只提出一點小改進。相反的:

header("Location: {$rebuilt_url}"); 

你應該這樣做:

header ('HTTP/1.1 301 Moved Permanently'); 
header("Location: {$rebuilt_url}"); 

這將讓瀏覽器緩存這些URL積極,每次你的代碼和SQL查詢將不會被執行。

同時檢查:

  1. .htaccess if URL is bad do something
  2. .htaccess rewrite friendly URLs