Apache 充当反向代理时重写 URL

Apache 充当反向代理时重写 URL

我似乎在使用 Apache 的 mod_rewrite 重写 URL 请求时遇到了问题,同时将其与 mod_proxy 一起使用以充当反向代理。总之,我试图将对未压缩 CSS 的请求重定向到位于另一个目录中的压缩 CSS。

我目前有一个 Web 应用在 请求其 CSS https://example.com/assets/css/styles.css。我将精简的 CSS 存储在https://example.com/assets/css/min/styles.min.css。由于我无法更改 CSS 链接的代码,因此我想使用 Apache 的 mod_rewrite 将所有请求转换assets/css/styles.cssassets/css/min/styles.min.css

此外,Web 应用程序目前正在单独的后端服务器上运行,192.168.1.100因此我已将 ProxyPass 和 ProxyPassReverse 设置为

ProxyPass / http://192.168.1.100/
ProxyPassReverse / http://192.168.1.100/

目前,我尝试添加

<Location /assets/css>  
  RewriteEngine On
  RewriteBase /assets/css
  RewriteCond %{REQUEST_URI} ^/assets/css/((.+)\.css)$
  RewriteCond %{DOCUMENT_ROOT}/assets/css/min/%2.min.css -f
  RewriteRule ^(.+)$ min/%2.min.css [L]
</Location>

我也尝试过在末尾添加一个斜杠,/assets/css但没有任何效果。我现在很困惑,因为我对 mod_rewrite 不是很在行。

我认为这可能是由于 Mod_Proxy 和 Mod_Rewrite 之间的交互导致了此问题。我从我的另一个项目中获取了 Location 块代码片段,并适当调整了文件路径。它在那个没有使用 Mod_Proxy 并直接提供内容的项目上正常工作。

答案1

<Location> 块中的当前指令仅适用于 Apache 直接提供的文件。第二个 RewriteCond 是对文件系统上存在的文件的测试。它无法测试后端服务器是否能够提供该最小化文件。

因此,您要么需要盲目地重写最小化版本的 URI 路径,要么研究如何在后端进行配置。

在你的 Apache 服务器上,类似这样的内容:

<位置 /assets/css>
  重写引擎开启
  重写规则 ^/assets/css/([^/]+)\.css$ /path/to/min/$1.min.css [L,PT]
</位置>

相关内容