2009-09-28 112 views
0

我有一個需要MOD-重寫我的基於域的子域關閉的......有兩個場景中,我需要做的是:mod_rewrite的複雜問題

  1. 我的網站位於不同的城市...所以losangeles.example.com應該本地化爲洛杉磯等...基本上重寫爲www.example.com/?loc=losangeles

  2. 我想允許用戶創建username.example.com到輕鬆傳遞他們的檔案給朋友...基本上重寫爲www.example.com/user.php?id=username

由於我的網站規模龐大,我計劃擁有超過300個位置和數千個用戶......這意味着編寫每個重寫規則的手會有點乏味。

我該如何告訴mod-rewrite在位置子域和用戶名子域之間進行解密?

回答

2

我認爲從根本上說,您需要重新思考該策略,因爲混合您的名稱空間將會在長期內引發許多令人頭疼的問題。考慮如果您錯過了城市名稱(如alexandra.example.com),但用戶註冊了該用戶名,會發生什麼情況?另外,你將不得不做一些事情,例如在用戶名嘗試創建的時候檢查一個城市是否存在。

如果你真的想堅持這一點,一種可能性就是將請求發送到一個點,然後對兩個數據庫進行查找,然後在內部設置$ city或$ user的變量。

一旦你已經設置了DNS通配符,在Apache的設置:

ServerAlias *.example.com 

,然後你的虛擬主機的其餘正常。

然後在應用程序中檢查$ _SERVER ['SERVER_NAME'],例如

$server_name = addslashes($_SERVER['SERVER_NAME']);  
$query = "select * from instances where '{$server_name}' regexp replace(concat(server, '$'),'.','\.') limit 1"; 

但是你實際上將不得不有兩個查詢和額外的邏輯來拉開兩個命名空間或處理衝突情況。

我會使用一個命名空間像

<cityname>.example.com/user/<username> 

這將避免的問題,同時也意味着你可以自定義什麼是對用戶的網頁取決於你輸入哪個城市,如果希望看到。

+1

不要對MySQL使用'addslashes'。更好地使用'mysql_real_escape_string'。 – Gumbo 2009-09-29 04:47:42