带有代理和排除的 html5 pushstate 的 Apache 重写规则
Posted
技术标签:
【中文标题】带有代理和排除的 html5 pushstate 的 Apache 重写规则【英文标题】:Apache rewrite rule for html5 pushstate with proxy and exclusions 【发布时间】:2016-09-07 03:07:59 【问题描述】:我使用apache
作为http
服务器,tomcat8
作为应用服务器 (rest
),express
作为angular2
静态服务器。
以下是我的虚拟主机元素
<VirtualHost *:80>
... other things - name path and logs ...
ProxyPass /rest/ http://localhost:8080/rest/
ProxyPassReverse /rest/ http://localhost:8080/rest/
ProxyPass / http://localhost:3000/
ProxyPassReverse / http://localhost:3000/
</VirtualHost>
基本上我正在做的是,每当有人点击http://localhost
他应该看到托管在http://localhost:3000
上的静态网络应用程序,当有人(网络应用程序)请求http://localhost/rest
时,请求应该到达tomcat8
在8080
上进行休息电话。
这工作正常。
现在我想要什么
我正在使用为angular2
应用程序服务的express
静态服务器。此应用程序使用html5
pushState
作为路由器。每当用户刷新页面时,它都会显示未找到错误。
我想要重定向规则如下所示
http://localhost/somepath
=> http://localhost?redirect=/somepath
http://localhost/rest
=>(不要重写而是继续代理)http://localhost:8080/rest
我没有在这里了解如何使用重写规则。
RewriteEngine on
RewriteCond %REQUEST_URI !(/rest/)
RewriteCond "%QUERY_STRING" "!(.*(?:^|&))_redirect=([^&]*)&?(.*)&?$"
RewriteRule "^/?(.*)" "http://localhost?_redirect=$1" [L,R,NE,QSA]
上面是我的代码,但它不起作用。谁能建议我适当的条件和规则?
【问题讨论】:
【参考方案1】:这就是我最终要做的事情
RewriteEngine on
// exception for everything which is on the webapp but has physical path
RewriteCond %REQUEST_URI !(/rest/)
RewriteCond %REQUEST_URI !(/bootstrap-template/)
RewriteCond %REQUEST_URI !(/lib/)
RewriteCond %REQUEST_URI !(/app/)
RewriteCond %REQUEST_URI !(/assets/)
RewriteCond %REQUEST_URI !(/browser-sync/)
RewriteCond %REQUEST_URI !(/node_modules/)
RewriteCond %REQUEST_URI !(/styles.css)$
RewriteCond %REQUEST_URI !(/Helvetica.otf)$
// exceptions end
RewriteCond %REQUEST_URI (/)(.+)$
RewriteCond "%QUERY_STRING" "!(.*(?:^|&))_redirect=([^&]*)&?(.*)&?$"
RewriteRule "^/(.*)" "http://localhost?_redirect=$1" [L,R,NE,QSA]
ProxyPass /pixie/ http://localhost:8080/pixie/
ProxyPassReverse /pixie/ http://localhost:8080/pixie/
ProxyPass / http://localhost:3000/
ProxyPassReverse / http://localhost:3000/
【讨论】:
以上是关于带有代理和排除的 html5 pushstate 的 Apache 重写规则的主要内容,如果未能解决你的问题,请参考以下文章
带有 history.pushState 和 popstate 的 Ajax - 当 popstate 状态属性为空时我该怎么办?
httpd.conf 和 HTML5 pushstate()
如果 popstate 事件来自带有 HTML5 推送状态的后退或前进操作,我如何检索?
ajax与HTML5 history pushState/replaceState实例