我正在尝试从我的 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/