mod_proxy
+ mod_rewrite
私は、メインドメイン上の単一のパス接頭辞を持つすべてのURLが内部的にapp2へのプロキシ要求に書き換えられるようにします。これにはいくつかの利点があります:
- フロントエンドをサーバーの設定で汚染することはありません。これは心配の良い分離を提供し、コードが開発者と生き方の間で違わないことを保証する。
- クライアントには、すべての要求が同じスキーム、ドメイン、およびポートに送信されるため、CORSの問題はありません。
- Ajax URLはroot-relativeである可能性があるため、よりクリーンです。 (あなたのすべてのURLである必要があります)
- 変更されていない同じ
.htaccess
ファイルは、送信されたホストヘッダーに基づいて各アプリケーション2に条件付きで書き換えることができるため、開発サーバーとライブサーバーで使用できます。 (アクセス権があればあなたの仮想ホストに設定を入れておくべきですが)
- 同じ条件付きロジックを使用して、ライブでのみhttpsを適用することができます。
- ユーザを中断することなく、単一のルールを編集することによって、再配置/アップグレードのために異なるapp2サーバに切り替えることができます。
あなたのフロントエンドで、その後.htaccess
RewriteEngine on
# force https and single domain on live
RewriteCond %{HTTP_HOST} !=localhost
RewriteCond %{HTTP_HOST} ^(?!real-app1\.com$). [NC,OR]
RewriteCond %{HTTPS} =off
RewriteCond %{THE_REQUEST} ^\S+\s+/(\S*)
RewriteRule^https://real-app1.com/%1 [NS,NE,L,R=301]
# API proxy on dev
RewriteCond %{HTTP_HOST} =localhost
RewriteCond %{THE_REQUEST} ^\S+\s+/API(?:/(\S*))?
RewriteRule ^API(?:$|/) http://localhost:3001/%1 [NS,NE,P]
# API proxy on live (no need for hostname check)
RewriteCond %{THE_REQUEST} ^\S+\s+/API(?:/(\S*))?
RewriteRule ^API(?:$|/) https://real-app2.com/%1 [NS,NE,P]
でこれを行うと仮定すると、通常のリンクはちょうどあなたがライブラリを使用していると仮定すると、<a href="/foo/bar/">…
を可能とすることができ、AJAXは、このように簡単することができ:
$.ajax('/API/path/to/endpoint/', {
data: {
query_param: 'param_value'
}
})
.done(function() {
// API works
})
.fail(function() {
// oh dear
});
ここで、app2はhttp://localhost:3001/path/to/endpoint/?query_param=param_value
を受け取る必要があります。これを正しく設定する作業量は、アプリケーションのライフサイクルにおける設定や配備の問題を管理することの頭痛よりも少なくなります。間違いなく価値がある。
実際にapp1が要求したURLをどうにか変更する必要があります。それのまわりには道がない。通常、そのようなURL(少なくともベースURL)は、アプリケーションの設定パラメータであり、パスにハードコードされていません。ですから、それを設定ファイルに置くこともできますし、より洗練された方法で、httpサーバからphpスクリプトに環境変数として渡すこともできます。次に、あなただけの書き換えのすべての手段をご利用いただけます。しかし、それがなければ、リクエストはあなたのローカルのHTTPサーバーにも届かず、何かをしようとするすべての試みは単に効果がありません。 – arkascha
よろしくお願いします。ありがとうございました! –
ああ、プロダクションシステム名をローカルアドレスに解決するには、ローカルホスト名の設定を変更するオプションがあります。次に、実稼働システム名でローカルのhttpサーバーに仮想ホストをローカルに構成し、自己署名証明書でhttpsをオンにする必要があります。それはうまくいくはずです。あなたのアプリだけがhttps接続用の自己署名証明書を受け入れる必要があるので、証明書の有効性を無効にする必要があります。 – arkascha