具有正则表达式重定向的Mod_Proxy

时间:2014-12-17 04:40:06

标签: regex apache .htaccess redirect httpd.conf

我有一个domainA.com,我想将其重定向到:

domainB.com/public.php?service=shorty_relay&id=$1

因此浏览器上的输入应该是domainA.com/f7g6f87g,并且应该将后台重定向到domainB.com/public.php?service=shorty_relay&id=f7g6f87g,但是将域保留在浏览器上。

我的虚拟主机行是:

<VirtualHost *:80>
    ServerAdmin email@address.com
    DocumentRoot /var/www/dir
    ServerName domainA.com
    ServerAlias www.domainA.com
    ProxyPass / https://domainB.com/public.php?service=shorty_relay&id=$1
    ProxyPassMatch ^/([A-Za-z0-9]{4,12})$ https://domainB.com/public.php?service=shorty_relay&id=$1
    ProxyPassReverse / https://domainB.com/public.php?service=shorty_relay&id=$1
    ErrorLog /var/www/dir/error.log
</VirtualHost>

使用当前行我可以将domainA.com重定向到domainB.com的根目录。但它不是我需要的。我需要domainA.com只接受有效的ID(?service = shorty_relay&amp; id = $ 1 ) 我知道我必须结合这个正则表达式,所以我只能允许有效的id。

 ProxyPassMatch ^/([A-Za-z0-9]{4,12})$ https://domainB.com/public.php?service=shorty_relay&id=$1

任何线索如何才能实现这一目标。我现在试图解决这个问题,但没有运气。

1 个答案:

答案 0 :(得分:1)

摆脱ProxyPass行。该行的工作方式类似于mod_alias的Redirect指令。它表示/自动附加到目标URL末尾后的任何内容,不包括查询字符串。这意味着$1与此指令无关,因为您没有使用正则表达式来捕获匹配项。

您唯一需要的是ProxyPassMatch行:

ProxyPassMatch ^/([A-Za-z0-9]{4,12})$ https://domainB.com/public.php?service=shorty_relay&id=$1

此外,您不需要在ProxyPassReverse中包含查询字符串。该指令用于&#34;反向&#34;将从domainB.com发送的地图重定向映射到domainA.com中的匹配URL。所以这应该足够了:

ProxyPassReverse / https://domainB.com/public.php