2012-08-28 52 views
3

剛剛爲我們的企業應用程序完成了REST API的第一個版本,並轉向了下一個版本。我有興趣瞭解使用子域來API版本的優點/漏洞。使用子域來版本化REST API

讓我們假設這樣的結構:

Source文件夾:

/var/www/html/domain/api/ (A) 

這是唯一的版本了。比方說,從現在起兩週後,我們發佈了API的第二版。將文件從上面的文件夾複製到v1.0。所以新的版本文件夾將是;

Source文件夾:

/var/www/html/domain/apiv1-0/ (B) 

文件夾B將不變。所有新的開發將推到'A'的主文件夾。 對付指向正確的文件夾,在文件.htaccess,我們寫的是這樣的:

- Check the subdomain 
    - Match it with the folder 
    - Server files from that folder. 

例子:

api.domain.com ==> Always serves the latest version. 
    apiv1-0.domain.com ==> Version 1 API will be served. 
    apiv2-0.domain.com ==> Version 2 API will be served. 

我想知道這是否是一個很好的做法。任何警告? AND 如何設置'.htaccess'來處理上述問題?

我不想在URI中使用版本號。這可能是一種標準做法,但我不喜歡它。

編輯: 正如你所看到的,儘管它的不同的子域,我不擔心每一次,當一個新版本發佈有關Apache配置甚至.htaccess配置。

編輯: 的基本文件夾:

/var/www/html/domain/ 

回答

1

我想知道這是否是一個很好的做法。任何警告?

如果您的意思是對REST API進行版本控制和部署的方式,我認爲這很好。至於爲此使用htaccess路由,存在一些警告,其中可能通過其他域訪問不同的API,儘管這取決於您的服務器配置而不是規則。例如,如果設置了默認虛擬主機,某人可能通過http://123.45.67.89/apiv1-0/訪問api文件夾。

如何設置'.htaccess'來處理上述問題?

你想這樣的:

RewriteEngine On 
# ensure trailing slashes for /api otherwise mod_dir will expose the underlying layout 
RewriteCond %{HTTP_HOST} ^(www\.)?domain.com$ [NC] 
RewriteCond %{DOCUMENT_ROOT}/api%{REQUEST_URI} -d 
RewriteRule ^(.*[^/])$ /$1/ [L,R=301] 

# for /api 
RewriteCond %{HTTP_HOST} ^(www\.)?domain.com$ [NC] 
RewriteCond %{DOCUMENT_ROOT}/api%{REQUEST_URI} -f [OR] 
RewriteCond %{DOCUMENT_ROOT}/api%{REQUEST_URI} -d 
RewriteRule ^(.*)$ /api/$1 [L] 

# ensure trailing slashes for /apivXXX otherwise mod_dir will expose the underlying layout 
RewriteCond %{HTTP_HOST} !^www\. [NC] 
RewriteCond %{HTTP_HOST} ^(.+)\.domain.com$ [NC] 
RewriteCond %{DOCUMENT_ROOT}/%1%{REQUEST_URI} -d 
RewriteRule ^(.*[^/])$ /$1/ [L,R=301] 

# for everything else 
RewriteCond %{HTTP_HOST} !^www\. [NC] 
RewriteCond %{HTTP_HOST} ^(.+)\.domain.com$ [NC] 
RewriteCond %{DOCUMENT_ROOT}/%1%{REQUEST_URI} -f [OR] 
RewriteCond %{DOCUMENT_ROOT}/%1%{REQUEST_URI} -d 
RewriteRule ^(.*)$ /%1/$1 [L] 

第2條規則幾乎複製了第2次2,但第一個地圖WWW *(或沒有),以/api/,第二個2個規則處理映射到目錄中的子域(apiv1-0 .domain.com映射到/apiv1-0/

的mod_dir檢查是因爲當您嘗試請求一個目錄,mod_dir的DirectorySlash將重定向請求,如果有一個丟失的斜線。發生這種情況時,您的佈局已暴露,並且無法正常工作。舉例來說,如果你有一個目錄test/api/下,你要求http://domain.com/test,它會被改寫爲/api/test和mod_dir將看到「測試」是目錄,但沒有尾隨斜線,所以mod_dir會(錯誤地)將瀏覽器重定向到http://domain.com/api/test/,跟蹤斜線但暴露/api/