使用子域来版本RESTAPI
刚刚为我们的企业应用程序完成了RESTAPI的第一个版本,并进入下一个版本。我很想知道使用子域来版本API的好处/漏洞 让我们假设这种结构: 源文件夹:使用子域来版本RESTAPI,api,.htaccess,versioning,Api,.htaccess,Versioning,刚刚为我们的企业应用程序完成了RESTAPI的第一个版本,并进入下一个版本。我很想知道使用子域来版本API的好处/漏洞 让我们假设这种结构: 源文件夹: /var/www/html/domain/api/ (A) /var/www/html/domain/apiv1-0/ (B) 这是目前唯一的版本。比方说,两周后,我们将发布API的第二版。将文件从上述文件夹复制到v1.0。因此,新版本的文件夹将是 源文件夹: /var/www/html/domain/api/ (A)
/var/www/html/domain/api/ (A)
/var/www/html/domain/apiv1-0/ (B)
这是目前唯一的版本。比方说,两周后,我们将发布API的第二版。将文件从上述文件夹复制到v1.0。因此,新版本的文件夹将是
源文件夹:
/var/www/html/domain/api/ (A)
/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.
我想知道这是否是一个好的做法。有什么警告吗?
及
如何设置“.htaccess”来处理上述问题
我不想在URI中使用版本号。这可能是一种标准做法,但我不喜欢
编辑:
正如您所看到的,尽管其子域不同,但每次发布新版本时,我都不必担心Apache
配置,甚至不必担心.htaccess
配置
编辑:
基本文件夹:
/var/www/html/domain/
我想知道这是否是一个好的做法。有什么警告吗
如果您指的是一种对RESTAPI进行版本控制和部署的方法,我认为这很好。至于为此使用htaccess路由,有一些警告,不同的API可能通过其他域访问,尽管这将更多地取决于您的服务器配置而不是规则。例如,如果设置了默认vhost,则可能有人可以通过http://123.45.67.89/apiv1-0/
如何设置“.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条规则几乎是重复的,但是第一条规则将www*(或无)映射到/api/
,第2条规则处理映射到目录的子域(apiv1-0。domain.com映射到/apiv1-0/
)
mod_dir检查是因为当您尝试请求一个目录时,如果缺少尾随斜杠,mod_dir的directorysslash
将重定向请求。当这种情况发生时,您的布局被暴露,它将无法工作。例如,如果您在/api/
下有一个目录test
,并且您请求http://domain.com/test
,它将被重写为/api/test
,mod_dir将看到“test”是一个目录,但没有尾随斜杠,因此mod_dir将(错误地)将浏览器重定向到http://domain.com/api/test/
,带尾随斜杠,但显示/api/