Apache 别名和多个版本的代码库


Apache Alias and multiple versions of codebase

我正在尝试从我的 Apache 文档根目录之外的单独目录运行版本化的 API。

我目前的方法是使用 Alias 指令尝试此操作:

Alias /api/v1.2/ /var/www/api-v1.2/
Alias /api/v1.1/ /var/www/api-v1.1/

这工作正常,但是我使用的是PHP框架(Codeigniter(,该框架使用mod_rewrite将所有请求路由到我的索引.php前端控制器:

RewriteCond %{REQUEST_URI} !=/server-status
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)$ index.php/?$1 [L]

我可以通过 URL 访问实际文件,并且别名指令工作正常。当我访问系统要重写的 URL 时,请求是从文档根目录提供的。

如何让我的 CI 应用程序遵循别名规则,同时仍将流量路由到每个相应的前端控制器?

编辑:为了清楚起见,我的CI代码库有3个单独的版本:1个在Apache文档根目录中,另外2个在每个别名目录中。我想根据 URL 将请求路由到正确版本的代码库(如果没有匹配的别名,则默认为 doc root(。

/var/www/html (doc root)
/var/www/api-v1.2
/var/www/api-v1.1

因此,问题在于您不会阻止初始.htaccess重写文件夹。

您将需要 3 个.htaccess文件,一个在根目录中,一个在 v1.1 和 v1.2 文件夹中。

(文档根(:

RewriteEngine on
RewriteBase /
RewriteCond %{REQUEST_URI} !=/server-status
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond $1 !^(index'.php|robots'.txt|api/v1.1|api/v1.2)
RewriteRule ^(.*)$ index.php/$1 [L]

重要的一行是它告诉 apache 忽略 api 文件夹的最后一RewriteCond

API-v1.1 文件夹:

RewriteEngine on
RewriteBase /api/v1.1
RewriteCond %{REQUEST_URI} !=/server-status
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond $1 !^(index'.php|robots'.txt)
RewriteRule ^(.*)$ index.php/$1 [L]

API-v1.2 文件夹:

RewriteEngine on
RewriteBase /api/v1.2
RewriteCond %{REQUEST_URI} !=/server-status
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond $1 !^(index'.php|robots'.txt)
RewriteRule ^(.*)$ index.php/$1 [L]

重要的台词正在RewriteBase。这告诉 apache 我们正在处理的目录,并将根据其名称处理重写。

所以,我认为这很简单。您希望确保重写条件集 (RewriteCond( 在一种情况下不匹配 - 当它们以"/api"或"api"开头时 - 这样它们就不会触发重写规则。

因此,只需在 CodeIgniter 重写条件的顶部添加此行:

RewriteCond %{REQUEST_URI} !(^(/)?api)

这将防止在请求 URI("http://example.com/"之后的部分(以/api 或 API 开头时匹配该组条件。 任何与/api 或 api 不匹配的请求 URI 都将触发 CodeIgniter 规则。

有两个秘密需要mod_rewrite:
1(它将传入的请求分解为标记:HTTP_HOST(例如"http://example.com"(,REQUEST_URI(http://example.com 后面的部分 - 如/index.php(和可选的QUERY_STRING("http//example.com/index.php?test=3"中?后面的部分(。

2(然后你可以使用perl正则表达式来匹配这些标记并重写URL以指向资源,或者实际上,执行任意数量的URL重写或替换。

引用:
1(重写教程:http://httpd.apache.org/docs/2.2/rewrite/intro.html
2(重写引用:http://httpd.apache.org/docs/2.2/mod/mod_rewrite.html
3(正则表达式备忘单:http://www.cheatography.com/davechild/cheat-sheets/regular-expressions/