【发布时间】:2009-01-20 06:43:59
【问题描述】:
我有一个 JSP Web 服务器,所有页面都以 .jsp 扩展名结尾。
如何在不使用非 Java 技巧(例如 apache 重写)的情况下将其隐藏在我的 Web 服务器 url 中?
例如: 而不是输入http://www.sample.com/search.jsp?xxx 用户只需键入 http://www.sample.com/search?xxx
【问题讨论】:
我有一个 JSP Web 服务器,所有页面都以 .jsp 扩展名结尾。
如何在不使用非 Java 技巧(例如 apache 重写)的情况下将其隐藏在我的 Web 服务器 url 中?
例如: 而不是输入http://www.sample.com/search.jsp?xxx 用户只需键入 http://www.sample.com/search?xxx
【问题讨论】:
您可以像这样创建一个 servlet 映射:
<servlet-mapping>
<servlet-name>MappingServlet</servlet-name>
<url-pattern>path/*</url-pattern>
</servlet-mapping>
必须根据您的需要编辑 url 模式。您当然需要创建 servlet 以便将 url 映射到实际的 jsp。大多数 MVC 框架都使用这种技术。
【讨论】:
在您的 web.xml 文件中使用此 servlet 映射。
<servlet>
<servlet-name>search</servlet-name>
<jsp-file>/search.jsp</jsp-file>
</servlet>
<servlet-mapping>
<servlet-name>search</servlet-name>
<url-pattern>/search</url-pattern>
</servlet-mapping>
【讨论】:
UrlRewrite 是一个很好的灵活的基于 Java 的独立于框架的解决方案。
这比 web.xml 中的 Servlet 映射要好,因为它的功能太有限,而且比基于 Apache 的解决方案要好,因为它是 Web 应用程序的一部分,因此您不需要将 Apache 放入应用程序服务器的前端。
【讨论】:
将 .jsp 映射为 servlet,但使用
<servlet>
<servlet-name>myjsp</servlet-name>
<jsp-file>/myjsp.jsp</jsp-file>
</servlet>
【讨论】:
如果您选择 Apache 重写规则,而不是应用程序服务器映射/过滤器(如我所做的那样),您可能还想做更多的事情,而不仅仅是查找 "^([0-9a-zA-Z]+) $"
如果 apache 面向非 jsp 资源提供服务,您可能需要确认该 url 不是确实存在的目录或文件。并确认 JSP 存在,并进行传递而不是重定向,并附加任何可能的查询字符串。
RewriteCond %{REQUEST_URI} !^/.*\.(jsp)$
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{DOCUMENT_ROOT}%{REQUEST_FILENAME}.jsp -f
RewriteRule ^(.+)$ /$1.jsp [PT,QSA,L]
为了确保用户只能通过 /search 而不是 /search.jsp 看到此内容,那么您还想重写反向代码
RewriteRule ^(.+)\.jsp$ $1 [R=301,QSA,L]
RewriteRule ^(.+)index$ $1 [R=301,QSA,L]
这对于 SEO 来说是一个好主意,这样搜索引擎就不会因为在多个 url 上复制内容而对您不利。
【讨论】:
我有一个位于 data/feed.jsp 的 jsp 将此添加到我的 web.xml 意味着我可以在数据/提要中访问它...
<servlet>
<servlet-name>feed</servlet-name>
<jsp-file>/data/feed.jsp</jsp-file>
</servlet>
<servlet-mapping>
<servlet-name>feed</servlet-name>
<url-pattern>/data/feed</url-pattern>
</servlet-mapping>
【讨论】:
RewriteEngine On
RewriteRule ^([0-9a-zA-Z]+)$ $1.jsp
在您的 .htaccess 中应该将所有 URL 重写为 .jsp。因此,正如您所描述的,search.jsp 将只是搜索。
【讨论】:
advanced-search.jsp 将不起作用。
我不是 JSP 专家,但我认为您可以在 web.xml 中定义 URL 映射来为您的 servlet 和 jsps 提供别名。
【讨论】: