1

ポート80には、通常のApacheWebサーバーがあります。

ポート8080には、クライアント側とサーバー側のものを含むTomcatがあります。

私の目標は:

www.mydomain.comは、javascriptのものがロードされている間、静的でSEOに適したindex.htmlをレンダリングします。

このindex.htmlのヘッダーに、www.mydomain.com:8080 / myapp/stuff.jsをロードします

stuff.jsはgwtでコンパイルされ、RootLayoutPanel.get()。add(nice_panel)を呼び出します。これにより、静的コンテンツが削除され、動的ウィジェットが表示されます。また、サーブレット(サーバー側コード)も呼び出します。

問題:セキュリティ上の理由から、www.mydomain.com:8080 / myapp / stuff.jsは別のポートにあるため、ブラウザでロードできません。

間違った試み:「通常の」ApacheWebサーバーディレクトリからstuff.jsを含むTomcatWebアプリケーションへのシンボリックリンクを作成しようとしました。URLがwww.mydomain.com/mysymlink_to_tomcat/stuff.jsであるため、stuff.jsをロードできるようになりました。しかし、ブラウザのセキュリティルールにより、stuff.jsはサーバー側でサーブレットを再度呼び出すことができなくなりました(「XMLHttpRequestはロードできません...オリジン... Access-Control-Allow-Originでは許可されていません」)。

index.htmlからヘッダー付きのtomcatへのリダイレクトの「クレイジー」な解決策を避けたい('location:http: //mydomain.com :8080/another_index_on_tomcat.html ')。このソリューションは機能しますが、多くの欠点があります(SEO ...)

最善のアプローチは何でしょうか?

ありがとう。

4

3 に答える 3

3

基本的に2つの解決策があります。

  • 2つのオリジンで動作するxsiframeようにします。GWTのリンカーを使用して、ページ:80からスクリプトをロードできるようにします:8080(読者の場合:ロードではなく、スクリプトの機能に関するものです)。`gwt.xmlに以下を追加します。

    <add-linker name='xsiframe' />
    

    残念ながら、GWT-RPC(サーバーとの通信に使用するもの)の問題は解決されません。そのために、CORSがあります。

  • 単一のオリジンを使用する:Apache mod_proxy(またはmod_jk)を使用して、Apacheを介してTomcatをプロキシします。誰も使用することはなく:8080、すべてが通過し:80ます。https://developers.google.com/web-toolkit/doc/latest/DevGuideServerCommunication#DevGuideRPCDeploymentでApacheHTTPDとプロキシを使用したTomcatの使用を参照してください。

そしてもちろん、HTTPDを捨ててTomcatですべてを提供するソリューションもあります(最近のJavaとTomcatのバージョンでは速度の問題が修正されています)。

于 2012-10-22T23:40:08.397 に答える
1

これでセキュリティエラーを回避できるかどうかはわかりませんが、iframeを試すことはできます。Apacheには、Tomcatへのインデックスとiframeがあり、JSがiframe内に読み込まれます。それがSEOの問題に役立つならDunno。

于 2012-10-22T23:08:25.333 に答える
1

最善の解決策は、クライアント呼び出しがTomcatアプリケーションを要求しているときに、Apacheでポート80呼び出しを8080にリダイレクトすることです。

apacheにmod_jkをインストールし、必要なパスにコンテキストをマウントするように構成します。例:(edit /mods_enabled/jk.conf)

# Configure access to jk-status and jk-manager
# If you want to make this available in a virtual host,
# either move this block into the virtual host
# or copy it logically there by including "JkMountCopy On"
# in the virtual host.
# Add an appropriate authentication method here!
<Location /jk-status>
    # Inside Location we can omit the URL in JkMount
    JkMount jk-status
    Order deny,allow
    Deny from all
    Allow from 127.0.0.1
</Location>
<Location /jk-manager>
    # Inside Location we can omit the URL in JkMount
    JkMount jk-manager
    Order deny,allow
    Deny from all
    Allow from 127.0.0.1
</Location>

JkMount /*/myAppDir/* ajp13

次に、サイト設定に仮想ホストを追加します(/ apache2 / sites-enabled /を編集します)

    <VirtualHost *:80>
    . Here is the rest of the
    . of the config of
    . the host
    # Tomcat jk connector settings
    JkMount /*.jsp ajp13_worker
    JkMount /myAppDir/* ajp13_worker
    JkMount /myAppDir* ajp13_worker
    JKMount /manager* ajp13_worker
    JkMount /manager/* ajp13_worker
    </VirtualHost>

また、server.xmlファイルを編集し、タグ内で前のHost name="localhost"を書き込んでコメントする必要があります。

<!-- Define an AJP 1.3 Connector on port 8009 -->

<Connector port="8009" protocol="AJP/1.3" redirectPort="8443" />

<Host name="localhost" appBase="webapps" unpackWARs="true"
   autoDeploy="true" >

          <Context path="/" docBase="/var/lib/tomcat7/webapps/myAppDir/"
                       debug="0" reloadable="true" />
          <!-- please notes on logs down below -->
     <Valve className="org.apache.catalina.valves.AccessLogValve"
             directory="/var/lib/tomcat7/logs" prefix="tomcat_access_" 
            suffix=".log" pattern="common" resolveHosts="false" />
  </Host>

あとは、workers.propertiesファイルを編集して追加するだけです。

worker.myapp2.port=8009
worker.myapp2.host=localhost
worker.myapp2.type=ajp13
worker.loadbalancer.type=lb
worker.loadbalancer.balance_workers=ajp13_worker

次に、動作するように設定する必要があります。myAppDirを含むURLが表示されると、apacheサーバーは呼び出しをtomcatにリダイレクトし、応答はapacheから返されます。

于 2012-10-23T06:55:16.460 に答える