URL 中的复制服务器名称
Duplication server name in URL
我在配置 Apache 和 Tomcat 时遇到问题。我的目的是能够访问 tui.org/servlet
,当 tui.org
是我在本地计算机上配置的虚拟主机并且 /servlet/
是 url-pattern
,它定义在 web.xml
.但是我得到的 servelet 是 404 Not Found by Tomcat 但我可以通过 tui.org/tui.org/servlet
访问我的服务器 - 它有效。我服务器上的文件结构如下:
Root: /var/www/tui.org
-------->/WEB-INF/classes/a
-------->/WEB-INF/classes/a/MainServlet.class
-------->/WEB-INF/web.xml
-------->/index.html
我怎样才能实现这种行为?
web.xml:
<servlet-mapping>
<servlet-name>mainServlet</servlet-name>
<url-pattern>/servlet</url-pattern>
</servlet-mapping>
我的server.xml:
<?xml version="1.0" encoding="UTF-8"?>
<Server port="8005" shutdown="SHUTDOWN">
<Listener className="org.apache.catalina.startup.VersionLoggerListener" />
<Listener className="org.apache.catalina.core.AprLifecycleListener" SSLEngine="on" />
<Listener className="org.apache.catalina.core.JreMemoryLeakPreventionListener" />
<Listener className="org.apache.catalina.mbeans.GlobalResourcesLifecycleListener" />
<Listener className="org.apache.catalina.core.ThreadLocalLeakPreventionListener" />
<GlobalNamingResources>
<Resource name="UserDatabase" auth="Container"
type="org.apache.catalina.UserDatabase"
description="User database that can be updated and saved"
factory="org.apache.catalina.users.MemoryUserDatabaseFactory"
pathname="conf/tomcat-users.xml" />
</GlobalNamingResources>
<Service name="Catalina">
<Connector port="8080" protocol="HTTP/1.1"
connectionTimeout="20000"
redirectPort="8443" />
<Connector port="8009" protocol="AJP/1.3" redirectPort="8443" />
<Engine name="Catalina" defaultHost="localhost">
<Realm className="org.apache.catalina.realm.LockOutRealm">
<Realm className="org.apache.catalina.realm.UserDatabaseRealm"
resourceName="UserDatabase"/>
</Realm>
<Host name="localhost" appBase="/var/www/"
unpackWARs="true" autoDeploy="true">
<Valve className="org.apache.catalina.valves.AccessLogValve" directory="logs"
prefix="localhost_access_log" suffix=".txt"
pattern="%h %l %u %t "%r" %s %b" />
</Host>
</Engine>
</Service>
</Server>
tui.org 的配置(tui.org.conf /etc/apache2/sites-available:
<VirtualHost *:80>
ServerName tui.org
DocumentRoot /var/www/tui.org
<Directory /var/www/tui.org>
AllowOverride All
Require all granted
</Directory>
JkMount /servlet* ajp13_worker
</VirtualHost>
我使用 Apache2、tomcat9 和 Ubuntu 18.04.
提前致谢!
P.S。对不起我的英语。
这里有几个问题:
- 您不得使用 Apache 提供 Web 应用程序目录 - 例如您为 Apache 声明
DocumentRoot /var/www/tui.org
,为 Tomcat 声明 <Host appBase="/var/www/">
。
- 例如但不限于:servlet 规范明确禁止将目录 WEB-INF 提供给客户端,而您明确绕过了此限制。
- 部署在
Host
的 appBase
中的应用程序始终以该名称部署(除非在 context.xml 文件中以不同方式指定)。该规则的唯一另一个例外是如果一个目录被称为 ROOT
- 在这种情况下,它没有名称部署,因此省略了服务器名称后面的 tui.org 。
- 但这对于通过 Apache httpd 为整个 webapp 提供服务的问题来说是次要的。先修复那个。
解决最大问题的一种方法是省略 Apache 中的 DocumentRoot
指令,而是提供来自 Tomcat 的所有内容:JkMount * ajp13_worker
.
为了解决 tui.org/servlet
的寻址问题,我不得不将 <Context>
指令添加到 server.xml
:
<Context path="" docBase="/var/www/tui.org/"/>
并将 appBase
从 /var/www/
更改为 /var/www/tui.org/
。
为了解决访问 WEB-INF
的问题(感谢@OlafKock),我不得不在 tui.org.conf
旁边添加:
<Directory /var/www/tui.org>
AllowOverride All
Deny from all
</Directory>
我在配置 Apache 和 Tomcat 时遇到问题。我的目的是能够访问 tui.org/servlet
,当 tui.org
是我在本地计算机上配置的虚拟主机并且 /servlet/
是 url-pattern
,它定义在 web.xml
.但是我得到的 servelet 是 404 Not Found by Tomcat 但我可以通过 tui.org/tui.org/servlet
访问我的服务器 - 它有效。我服务器上的文件结构如下:
Root: /var/www/tui.org
-------->/WEB-INF/classes/a
-------->/WEB-INF/classes/a/MainServlet.class
-------->/WEB-INF/web.xml
-------->/index.html
我怎样才能实现这种行为?
web.xml:
<servlet-mapping>
<servlet-name>mainServlet</servlet-name>
<url-pattern>/servlet</url-pattern>
</servlet-mapping>
我的server.xml:
<?xml version="1.0" encoding="UTF-8"?>
<Server port="8005" shutdown="SHUTDOWN">
<Listener className="org.apache.catalina.startup.VersionLoggerListener" />
<Listener className="org.apache.catalina.core.AprLifecycleListener" SSLEngine="on" />
<Listener className="org.apache.catalina.core.JreMemoryLeakPreventionListener" />
<Listener className="org.apache.catalina.mbeans.GlobalResourcesLifecycleListener" />
<Listener className="org.apache.catalina.core.ThreadLocalLeakPreventionListener" />
<GlobalNamingResources>
<Resource name="UserDatabase" auth="Container"
type="org.apache.catalina.UserDatabase"
description="User database that can be updated and saved"
factory="org.apache.catalina.users.MemoryUserDatabaseFactory"
pathname="conf/tomcat-users.xml" />
</GlobalNamingResources>
<Service name="Catalina">
<Connector port="8080" protocol="HTTP/1.1"
connectionTimeout="20000"
redirectPort="8443" />
<Connector port="8009" protocol="AJP/1.3" redirectPort="8443" />
<Engine name="Catalina" defaultHost="localhost">
<Realm className="org.apache.catalina.realm.LockOutRealm">
<Realm className="org.apache.catalina.realm.UserDatabaseRealm"
resourceName="UserDatabase"/>
</Realm>
<Host name="localhost" appBase="/var/www/"
unpackWARs="true" autoDeploy="true">
<Valve className="org.apache.catalina.valves.AccessLogValve" directory="logs"
prefix="localhost_access_log" suffix=".txt"
pattern="%h %l %u %t "%r" %s %b" />
</Host>
</Engine>
</Service>
</Server>
tui.org 的配置(tui.org.conf /etc/apache2/sites-available:
<VirtualHost *:80>
ServerName tui.org
DocumentRoot /var/www/tui.org
<Directory /var/www/tui.org>
AllowOverride All
Require all granted
</Directory>
JkMount /servlet* ajp13_worker
</VirtualHost>
我使用 Apache2、tomcat9 和 Ubuntu 18.04.
提前致谢!
P.S。对不起我的英语。
这里有几个问题:
- 您不得使用 Apache 提供 Web 应用程序目录 - 例如您为 Apache 声明
DocumentRoot /var/www/tui.org
,为 Tomcat 声明<Host appBase="/var/www/">
。- 例如但不限于:servlet 规范明确禁止将目录 WEB-INF 提供给客户端,而您明确绕过了此限制。
- 部署在
Host
的appBase
中的应用程序始终以该名称部署(除非在 context.xml 文件中以不同方式指定)。该规则的唯一另一个例外是如果一个目录被称为ROOT
- 在这种情况下,它没有名称部署,因此省略了服务器名称后面的 tui.org 。- 但这对于通过 Apache httpd 为整个 webapp 提供服务的问题来说是次要的。先修复那个。
解决最大问题的一种方法是省略 Apache 中的 DocumentRoot
指令,而是提供来自 Tomcat 的所有内容:JkMount * ajp13_worker
.
为了解决 tui.org/servlet
的寻址问题,我不得不将 <Context>
指令添加到 server.xml
:
<Context path="" docBase="/var/www/tui.org/"/>
并将 appBase
从 /var/www/
更改为 /var/www/tui.org/
。
为了解决访问 WEB-INF
的问题(感谢@OlafKock),我不得不在 tui.org.conf
旁边添加:
<Directory /var/www/tui.org>
AllowOverride All
Deny from all
</Directory>