html5 具有代理和排除项的推送状态的 Apache 重写规则

Apache rewrite rule for html5 pushstate with proxy and exclusions

我使用 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 ,请求应在 8080 到达 tomcat8 进行休息。

这工作正常。

现在我想要什么

我正在使用 express 服务于 angular2 应用程序的静态服务器。此应用程序使用 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=" [L,R,NE,QSA]

以上是我的代码,但它不起作用。谁能给我建议合适的条件和规则?

这就是我最终要做的

    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=" [L,R,NE,QSA]

    ProxyPass /pixie/ http://localhost:8080/pixie/
    ProxyPassReverse /pixie/ http://localhost:8080/pixie/

    ProxyPass / http://localhost:3000/
    ProxyPassReverse / http://localhost:3000/