如何将Polymer 2.0应用部署到Apache httpd或Tomcat服务器?
我之前也碰到过完全一样的问题——Polymer单页应用在polymer serve里跑的顺风顺水,收藏的URL、路由跳转都没问题,一部署到Tomcat或者Apache httpd就翻车,尤其是刷新收藏的页面直接404。其实核心原因是单页应用的路由都是前端处理的,服务器不知道这些路由对应的资源,得通过URL重写把所有非静态资源的请求转发到index.html,让Polymer的路由系统来处理。下面给你两种服务器的具体配置方案,亲测有效:
部署到Tomcat的URL重写配置
Tomcat有两种靠谱的方式解决这个问题,推荐用第一种更精准的方案:
方式一:使用RewriteValve(推荐)
- 首先打开Tomcat的
conf/server.xml,找到你配置的<Host>标签,添加RewriteValve的配置:
<Host name="localhost" appBase="webapps" unpackWARs="true" autoDeploy="true"> <!-- 其他已有配置 --> <Valve className="org.apache.catalina.valves.rewrite.RewriteValve" /> </Host>
- 在你的Polymer应用的
WEB-INF目录下(如果没有就新建一个),创建rewrite.config文件,写入以下规则:
# 排除所有静态资源文件,让服务器直接返回 RewriteCond %{REQUEST_URI} !^/(.*\.(html|js|css|png|jpg|gif|ico|svg|json|txt))$ # 把所有非静态资源的请求转发到index.html RewriteRule ^(.*)$ /index.html [L]
- 如果你的应用部署在Tomcat的子上下文(比如
http://localhost:8080/my-polymer-app/),记得把RewriteRule的目标路径改成子上下文路径:
RewriteRule ^(.*)$ /my-polymer-app/index.html [L]
方式二:配置404错误页面(简单但不够精准)
如果不想折腾RewriteValve,也可以直接在WEB-INF/web.xml里添加404错误页面的转发:
<error-page> <error-code>404</error-code> <location>/index.html</location> </error-page>
这种方式的缺点是所有404请求(包括真正不存在的静态资源)都会跳转到index.html,适合简单场景使用。
部署到Apache httpd的URL重写配置
Apache的配置依赖mod_rewrite模块,步骤如下:
- 先确保Apache启用了
mod_rewrite模块:打开httpd.conf,找到并取消注释这一行(如果没有就添加):
LoadModule rewrite_module modules/mod_rewrite.so
- 在你的Polymer应用根目录下创建
.htaccess文件,写入以下规则:
RewriteEngine On # 如果请求的是存在的文件或目录,直接返回 RewriteCond %{REQUEST_FILENAME} !-f RewriteCond %{REQUEST_FILENAME} !-d # 其他所有请求转发到index.html RewriteRule ^(.*)$ index.html [L]
- 如果应用部署在子目录(比如
http://your-domain.com/my-polymer-app/),需要加上RewriteBase指定子目录路径:
RewriteEngine On RewriteBase /my-polymer-app/ RewriteCond %{REQUEST_FILENAME} !-f RewriteCond %{REQUEST_FILENAME} !-d RewriteRule ^(.*)$ index.html [L]
关键注意事项
别忘了检查Polymer应用的<base href>设置!开发时通常是<base href="/">,如果部署到子上下文或子目录,必须改成对应的路径,比如<base href="/my-polymer-app/">,否则静态资源和路由都会出问题。
内容的提问来源于stack exchange,提问作者user429960
相关产品推荐
相关产品推荐

