1

Apache ドキュメント ルート以外の別のディレクトリからバージョン管理された API を実行しようとしています。

私の現在のアプローチは、Alias ディレクティブでこれを試すことです:

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

これは正常に動作していますが、mod_rewrite を使用してすべてのリクエストを index.php フロント コントローラーにルーティングする PHP フレームワーク (Codeigniter) を使用しています。

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

URL 経由で実際のファイルにアクセスでき、エイリアス ディレクティブは正常に機能します。システムが書き換える URL にアクセスすると、リクエストはドキュメント ルートから処理されます。

トラフィックをそれぞれのフロント コントローラーにルーティングしながら、CI アプリケーションを Alias ルールに準拠させるにはどうすればよいですか?

編集:明確にするために、CI コードベースの 3 つの個別のバージョンがあります。1 つは Apache doc ルートにあり、2 つは各エイリアス ディレクトリにあります。URL に基づいて正しいバージョンのコードベースにリクエストをルーティングしたいと考えています (エイリアスが一致しない場合は、デフォルトでドキュメント ルートになります)。

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

2 に答える 2

0

ですから、これはかなり簡単だと思います。書き換え条件のセット (RewriteCond) が 1 つのケース ("/api" または "api" で始まる場合) に一致しないことを確認して、書き換えルールが起動されないようにする必要があります。

したがって、CodeIgniter 書き換え条件の先頭に次の行を追加するだけです。

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

これにより、リクエスト URI (「http://example.com/」の後の部分) が /api または api で始まる場合に、その一連の条件が一致しなくなります。/api または api に一致しないリクエスト URI は、CodeIgniter ルールを起動します。

mod_rewrite には 2 つの秘密があります:
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 に答える