Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/.htaccess/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用子域来版本RESTAPI_Api_.htaccess_Versioning - Fatal编程技术网

使用子域来版本RESTAPI

使用子域来版本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)

刚刚为我们的企业应用程序完成了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/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/