Apache proxypass 无法解析 url 等资源,例如图像和 css

Apache proxypass does not resolve url for resources like images and css

我需要将路径映射到我的 tomcat Web 应用程序。我为此使用了proxypass。 这是 apache2 中的当前配置

<VirtualHost *:80>
        ServerName localhost:80
        ProxyPass /app http://localhost:8088/ui/
        ProxyPassReverse /app http://localhost:8088/ui/


        ErrorLog ${APACHE_LOG_DIR}/error.log
        CustomLog ${APACHE_LOG_DIR}/access.log combined
</VirtualHost>

这是从tomcat得到的HTML但是cssurl形成的是错误的。 http://localhost/app/css/style.css 而不是 url 被映射为 http://localhost/ui/css/style.css.

我试过使用 rewrite,但没用。

RewriteEngine on
RewriteRule ^/ui/ /app/

我需要找到正确的方法来纠正 URL。 任何帮助将不胜感激!提前致谢。

这取决于您希望显示的 URL 是什么。如果你想让它成为

http://localhost/app/

那么您需要将您的静态内容移动到您的 WAR.ui/ 下。

如果你愿意

http://localhost/app/ui

那么您应该从 ProxyPass 行中删除尾随 /ui

作为第三种选择,您可以在 tomcat webapp 目录中创建指向 'ui' 的 'ROOT' 符号链接(并从代理中删除 /ui),这将允许您从 tomcat 路径

的根目录提供您的应用程序

经过反复试验,我找到了两种不同的解决方案。

  1. 使用 mod_rewrite 并对 proxypass 进行一些更改:

    <VirtualHost *:80>
        ProxyPreserveHost On
        ProxyPass /app http://localhost:8080/ui/
        ProxyPassReverse /app http://localhost:8080/ui/
    
        #since in java web app the context started with /ui the js src had /ui in the beginning
        #this resulted in 404 so I had to rewrite all request to /ui to forward to /app
    
        RewriteEngine on
        RewriteRule    "^/ui(.+)"  "/app"  [R,L]
    
        ErrorLog ${APACHE_LOG_DIR}/error.log
        CustomLog ${APACHE_LOG_DIR}/access.log combined
    </VirtualHost>
    
  2. 在 webapp 文件夹中创建一个 link/shorcut 部署应用程序并将快捷方式命名为 app 在 linux 中,命令是(来自 webapp 文件夹内)ln -s ui app

现在的 apache 配置是:

<VirtualHost *:80>
        ProxyPreserveHost On

        <Location /app>
            ProxyPass  ajp://localhost:8019/app/
            ProxyPassReverse ajp://localhost:8019/app/
            SetOutputFilter  proxy-html
            ProxyHTMLExtended On
            ProxyHTMLURLMap /app /app
            RequestHeader    unset  Accept-Encoding
        </Location>

        ErrorLog ${APACHE_LOG_DIR}/error.log
        CustomLog ${APACHE_LOG_DIR}/access.log combined
</VirtualHost>

在第一个解决方案中,重写 mod 导致请求 return 304,然后重定向到更正 url。这就是默认情况下的工作方式。

在第二种解决方案中,由于两个处理程序相同 (/app),因此没有理由进行重定向,并且 URL 已正确映射。