Apache2 反向代理 - 不同的处理或 URL

Apache2 反向代理 - 不同的处理或 URL

我正在努力解决反向代理配置和根据 URL 路径进行特定重写/代理传递的问题。

场景:

  • DMZ 中的反向代理
  • SSL 在反向代理上结束
  • 请求应通过 http 传递到内部服务器
  • HTTP 需要重写为 HTTPS
  • 在 html 中 href 的构建方式类似于“/system/js/abc.js”

我当前的配置:

<VirtualHost *:80>
    ServerName media.customer.com
    RewriteEngine On
    RewriteCond %{SERVER_PORT}s ^(443(s)|[0-9]+s)$
    RewriteRule ^(.*)$ https://media.customer.com$1 [R=301,L]
</VirtualHost>

<VirtualHost *:443>
    ServerName media.customer.com
    DocumentRoot /var/www/customer.com/

    SSLEngine On
    SSLCertificateKeyFile /etc/apache2/certs/server.key
    SSLCertificateFile /etc/apache2/certs/server.crt

    ProxyRequests Off
    ProxyPass / http://serverName/
    ProxyPassReverse / http://serverName/

    ProxyHTMLEnable On
    ProxyHTMLURLMap http://serverName/ /
</VirtualHost>

这不是一个大问题,但我们需要制定以下规则:

  1. 仅将 base-url “Http(s)://serverName” 路由到http://服务器名称/系统/(添加 /system/)到基本 URL
  2. 每个更深层的 URL 仅协议从 http 更改为 https。URL 没有变化。
  3. 绝对 http-URL 需要更改为 https-URL

上述配置适用于:

  • [http]/服务器名称/system/
  • [http]/服务器名称/系统
  • [https]/服务器名称/system/
  • [https]/服务器名称/系统
  • [http]/服务器名称/system/img/test.gif
  • [https]/服务器名称/system/img/test.gif

我是否在 RewriteRule 或 ProxyPass 中输入“/fotoweb/”,我们会得到双重字符串,例如: http://服务器名称/system/system/img/test.gif

我认为,我需要确定它是否是 base-url,然后添加“/system/”,否则只需映射到 http。但不知道该怎么做。

提前致谢!

答案1

这会将所有非 HTTPS 重写为 HTTPS:

RewriteCond %{HTTPS} !=on
RewriteRule .* https://%{SERVER_NAME}%{REQUEST_URI} [R=301,L]

不确定您认为的“base-url”是什么,但我假设它是 HTTPS + 不以“/system”开头。这会将所有不以“/system”开头的内容重写为“/system/...”:

RewriteCond %{REQUEST_URI} ! ^/system
RewriteRule .* /system%{REQUEST_URI} [R=301,L]

如果只是 '/',那么:

RewriteCond %{REQUEST_URI} ^/$
RewriteRule .* /system/ [R=301,L]

一体:

<VirtualHost *:80>
    ServerName media.customer.com
    RewriteEngine On
    RewriteCond %{HTTPS} !=on
    RewriteRule .* https://%{SERVER_NAME}%{REQUEST_URI} [R=301,L]
</VirtualHost>

<VirtualHost *:443>
    ServerName media.customer.com

    RewriteEngine on
    RewriteCond %{REQUEST_URI} ! ^/system
    RewriteRule .* /system%{REQUEST_URI} [R=301,L]

    DocumentRoot /var/www/customer.com/

    SSLEngine On
    SSLCertificateKeyFile /etc/apache2/certs/server.key
    SSLCertificateFile /etc/apache2/certs/server.crt

    ProxyRequests Off
    ProxyPass / http://serverName/
    ProxyPassReverse / http://serverName/

    ProxyHTMLEnable On
    ProxyHTMLURLMap http://serverName/ /
</VirtualHost>

相关内容