1

我正在尝试从我的 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 将所有请求路由到我的 index.php 前端控制器:

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

我可以通过 URL 访问实际文件,并且 alias 指令可以正常工作。当我访问系统打算重写的 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
4

2 回答 2

0

因此,问题在于您并没有阻止您的初始.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]

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

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 我们正在使用的目录,并将根据其指定处理重写。

于 2013-10-04T13:19:05.273 回答
0

所以,我认为这很简单。您要确保在一种情况下不匹配一组重写条件 (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/

于 2013-10-11T04:45:28.693 回答