1

在端口 80 上,我有普通的 apache web 服务器。

在端口 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) 将删除静态内容并显示动态小部件。它还调用 servlet(服务器端代码)。

问题:出于安全原因,浏览器不允许我加载 www.mydomain.com:8080/myapp/stuff.js,因为它位于不同的端口上。

错误的尝试:我试图创建一个从“普通”apache web 服务器目录到包含 stuff.js 的 tomcat webapp 的符号链接。我现在可以加载 stuff.js,因为它的 url 是:www.mydomain.com/mysymlink_to_tomcat/stuff.js。但是由于浏览器的安全规则(“XMLHttpRequest 无法加载……来源……Access-Control-Allow-Origin 不允许”),stuff.js 不再能够再次调用服务器端的 servlet。

我想避免使用 header('location: http://mydomain.com:8080/another_index_on_tomcat.html ') 从 index.html 重定向到 tomcat 的“疯狂”解决方案。该解决方案有效,但有许多缺点(SEO ...)

最好的方法是什么?

谢谢。

4

3 回答 3

3

您基本上有两种解决方案:

  • 使其与 2 个来源一起工作:使用xsiframeGWT 中的链接器以允许页面: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上的将 Tomcat 与 Apache HTTPD 和代理一起使用

当然,还有放弃 HTTPD 并使用 Tomcat 提供所有服务的解决方案(最近的 Java 和 Tomcat 版本已经修复了它们的缓慢问题)。

于 2012-10-22T23:40:08.397 回答
1

最好的解决方案是当客户端调用请求 tomcat 应用程序时,将端口 80 调用重定向到 apache 上的 8080。

在 apache 上安装 mod_jk 并将其配置为在您想要的路径上安装上下文示例:(编辑 /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 回答
1

我不确定这是否会避免安全错误,但您可以尝试使用 iframe。在 apache 上,你有 tomcat 的索引和 iframe,JS 在 iframe 中加载。不知道这是否有助于解决 SEO 问题。

于 2012-10-22T23:08:25.333 回答