如何在Apache重写规则中使用部分Referer标头

如何在Apache重写规则中使用部分Referer标头,apache,mod-rewrite,proxy,Apache,Mod Rewrite,Proxy,我正在编写一个通用代理,这样我就可以以http://////当前使用重写将请求代理到https://:// 我已经让那部分工作了,它似乎做了我想做的事情。然而,在某些情况下,我将其用于强制根相对URL的顽固站点。所讨论的应用程序不是特别容易更改(在某些情况下是不可能更改的) 我的问题是如何识别访问apache的根相对URL,并将它们代理到正确的主机。我已经确定了正确的主机详细信息仍然在referer头的路径中,所以我正在尝试分离并在重写规则中使用referer路径 更新代码如下: <Vir

我正在编写一个通用代理,这样我就可以以
http://////
当前使用重写将请求代理到
https://://

我已经让那部分工作了,它似乎做了我想做的事情。然而,在某些情况下,我将其用于强制根相对URL的顽固站点。所讨论的应用程序不是特别容易更改(在某些情况下是不可能更改的)

我的问题是如何识别访问apache的根相对URL,并将它们代理到正确的主机。我已经确定了正确的主机详细信息仍然在referer头的路径中,所以我正在尝试分离并在重写规则中使用referer路径

更新代码如下:

<VirtualHost *:80>
  ServerName wtf.devbox-cole.orion.internal
  ServerAlias wtf.devbox-cole

  RewriteEngine On

  <LocationMatch "^/$">
    Header always set X-CRAP-BASE "Its working kinda"
    Redirect 410 /
  </LocationMatch>

  <Location /web/>
    Header always set X-CRAP-BASE "Hardly Working"
    RewriteCond %{HTTP_REFERER} "http://%{HTTP_HOST}/([a-zA-Z0-9_\.]*)/([0-9]*)/.*"
    RewriteRule (.*) https://%1:%2/$1 [P]
  </Location>

  <LocationMatch "^/(?<host>[a-zA-Z0-9_\.]*)/(?<port>[0-9]*)/(?<path>.*)">
    RewriteRule ".*" https://%{env:MATCH_HOST}:%{env:MATCH_PORT}/%{env:MATCH_PATH} [P]
    ProxyPassReverse "https://%{env:MATCH_HOST}:%{env:MATCH_PORT}/%{env:MATCH_PATH}"
  </LocationMatch>

  # Enable proxying to https://
  SSLProxyEngine On
  # Allow Proxying to https without valid cert
  SSLProxyVerify none
  # Disable Domain Nmae checking on the Certs
  SSLProxyCheckPeerCN off
  SSLProxyCheckPeerName off
  # disbaled cert expiryt Check
  SSLProxyCheckPeerExpire off

  LogLevel debug rewrite:trace8
  CustomLog "/var/log/apache2/wtf_log" "%h"
  ErrorLog "/var/log/apache2/wtf_error
</VirtualHost>

ServerName wtf.devbox-cole.orion.internal
ServerAlias wtf.devbox-cole
重新启动发动机
标题总是设置X-CRAP-BASE“它的工作类型”
重定向410/
标题始终设置X-CRAP-BASE“难以工作”
重写第二个%{HTTP_REFERER}“HTTP://%{HTTP_HOST}/([a-zA-Z0-9\.]*)/([0-9]*)/”
重写规则(.*)https://%1:%2/$1[P]
重写规则“*”https://%%{env:MATCH_HOST}:%%{env:MATCH_PORT}/%%{env:MATCH_PATH}[P]
ProxyPassReverse“https://%%{env:MATCH_HOST}:%%{env:MATCH_PORT}/%%{env:MATCH_PATH}”
#启用代理到https://
SSLProxyEngine打开
#允许代理到没有有效证书的https
SSLProxyVerify无
#禁用证书上的域Nmae检查
SSLProxyCheckPeerCN关闭
SSLProxyCheckPeerName关闭
#取消证书到期检查
SSLProxycheckpeer关闭
日志级调试重写:trace8
CustomLog”/var/log/apache2/wtf_日志“%h”
ErrorLog“/var/log/apache2/wtf_错误

上面的代码仍然不太有效。仍在试图找出原因。

因此,经过多次尝试并阅读尽可能多的文档后,我成功地解决了我最初的问题。下面的VHost块将代理
http://domain.com///
https://://
,它会将任何请求映射到
/web/*
或从那个领域开始,回到正确的地方

<VirtualHost *:80>
  ServerName domain.com

  RewriteEngine On

  <LocationMatch "^/$">
    Header always set X-CRAP-BASE "Its working kinda"
    Redirect 410 /
  </LocationMatch>

  <Location /web/>
    Header always set X-CRAP-BASE "Hardly Working"
  </Location>

  RewriteCond %{REQUEST_URI} "^/web/.*"
  RewriteCond %{HTTP_REFERER} "http://.*/([a-zA-Z0-9_\.\-]*)/([0-9]*)/.*"
  RewriteRule (.*) https://%1:%2/$1 [P]

  RewriteCond %{REQUEST_URI} "^/([a-zA-Z0-9_\.\-]*)/([0-9]*)/(.*)"
  RewriteRule ".*" https://%1:%2/%3 [P]

  <LocationMatch "^/(?<host>[a-zA-Z0-9_\.\-]*)/(?<port>[0-9]*)/(?<path>.*)">
    ProxyPassReverse "https://%{env:MATCH_HOST}:%{env:MATCH_PORT}/%{env:MATCH_PATH}"
  </LocationMatch>

  # Enable proxying to https://
  SSLProxyEngine On
  # Allow Proxying to https without valid cert
  SSLProxyVerify none
  # Disable CN Checking on the Certs
  SSLProxyCheckPeerCN off
  SSLProxyCheckPeerName off
  # Disable Cert Expiry Check
  SSLProxyCheckPeerExpire off

  # Extra Logging
  #LogLevel debug rewrite:trace8
  CustomLog "/var/log/apache2/domain.com_log" "%h"
  ErrorLog "/var/log/apache2/domain.com_error
</VirtualHost>

ServerName域名.com
重新启动发动机
标题总是设置X-CRAP-BASE“它的工作类型”
重定向410/
标题始终设置X-CRAP-BASE“难以工作”
RewriteCond%{REQUEST_URI}“^/web/*”
重写第二个%{HTTP\u REFERER}“HTTP://.*/([a-zA-Z0-9\.-]*)/([0-9]*)/”
重写规则(.*)https://%1:%2/$1[P]
重写第二个%{REQUEST_URI}“^/([a-zA-Z0-9_\.-]*)/([0-9]*)/(.*)”
重写规则“*”https://%1:%2/%3[P]
ProxyPassReverse“https://%%{env:MATCH_HOST}:%%{env:MATCH_PORT}/%%{env:MATCH_PATH}”
#启用代理到https://
SSLProxyEngine打开
#允许代理到没有有效证书的https
SSLProxyVerify无
#禁用证书上的CN检查
SSLProxyCheckPeerCN关闭
SSLProxyCheckPeerName关闭
#禁用证书到期检查
SSLProxycheckpeer关闭
#额外记录
#日志级调试重写:trace8
CustomLog”/var/log/apache2/domain.com_日志“%h”
ErrorLog“/var/log/apache2/domain.com\u错误

然后我想起了引用者的头是多么愚蠢,因为如果一个CSS文件请求另一个CSS文件,或者一个图像,那么引用者就没有按预期设置:facepalm:

Woa,伟大的项目!你介意分享你的代理的URL吗?:-)除此之外:重写模块的文档中提到了引用者并实际给出了示例,这真是令人惊讶。看看你从中学到了什么是很有趣的。但你肯定已经读过了,决定在这里提问。。。以下是我迄今为止的最新定义:[gist]()-Web locaton块是我试图提取引用者标题段并将其传递给重写者的地方。我在文档中没有看到任何类似的内容。请在上面的问题中添加所有相关信息。请勿在评论或任意的场外位置发布附加信息。谢谢。对不起,我至今还没有考虑到我的工作是否可靠。因为您要求链接,所以正在发布。我要补充一下这个问题。