我正在努力解决反向代理配置和根据 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>
这不是一个大问题,但我们需要制定以下规则:
- 仅将 base-url “Http(s)://serverName” 路由到http://服务器名称/系统/(添加 /system/)到基本 URL
- 每个更深层的 URL 仅协议从 http 更改为 https。URL 没有变化。
- 绝对 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>