在端口80上我有正常的apache web服务器。
在端口8080上,我有tomcat与客户端和服务器端的东西。
我的目标是:
www.mydomain.com渲染一个静态和SEO友好的index.html,而javascript的东西正在加载。
在这个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 ...)
最好的方法是什么?
感谢。
答案 0 :(得分:3)
你基本上有两个解决方案:
使其适用于2个来源:使用GWT中的xsiframe
链接器允许: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版本已经修复了它们的缓慢问题)。
答案 1 :(得分:1)
我不确定这是否可以避免安全错误,但您可以尝试使用iframe。在apache上,你有一个索引和一个iframe到tomcat,其中JS在iframe中加载。 Dunno,如果这将有助于SEO问题。
答案 2 :(得分: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文件并在标记内写入并注释以前的主机名=“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返回。