如何为apache ProxyPassMatch编写正则表达式以反转代理API调用

时间:2017-09-08 12:09:00

标签: regex apache

我有一个角色4 Web应用程序,它托管在apache 2.4上。该应用程序使用在expressj上运行的nodejs javascript编写的API。网站和API服务都在同一台机器上运行,但在不同的端口上运行。该网站位于端口80上,API服务正在侦听端口9000。

我想设置apache来为所有API调用执行反向代理。

例如,任何包含/ api /我想要由apache重写的url指向API url:port。如果我使用ProxyPass,如下面的行,重定向工作正常:

//end Dialog 2

    SharedPreferences mypref = getPreferences(MODE_PRIVATE);

    checkBoxmp.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
        @Override
        public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
            SharedPreferences.Editor editor = mypref.edit();
            editor.putBoolean("playSounds", !isChecked);
            editor.commit();
            if (null != mp && null != mp2) {
                if (!isChecked) {
                    mp.setVolume(1, 1);
                    mp2.setVolume(1, 1);
                } else {
                    mp.setVolume(0, 0);
                    mp2.setVolume(0, 0);
                }
            }
        }
    });

我不知道该怎么做,是使用ProxyPassMatch指令并创建一个正则表达式,以便包含/ api /的任何url重定向到http://localhost:9000/api/ .....

我尝试了以下但不起作用:

ProxyPass        "/api/V1/systeminfo" "http://localhost:9000/api/V1/systeminfo"
ProxyPassReverse "/api/V1/systeminfo" "http://localhost:9000/api/V1/systeminfo"

以下都不是:

ProxyPassMatch    "^/api.*$" "http://localhost:9000/$1"
ProxyPassReverse  "^/api.*$" "http://localhost:9000/$1"

任何帮助将不胜感激。我的正则表达能力不足!

注意:显然' localhost'可以是IP地址或域,为简单起见,我在示例中使用它。

非常感谢!

编辑:我根据Alex的评论更正了第一个使用。*而不是*的示例。

1 个答案:

答案 0 :(得分:2)

我解决了这个问题。在上面的例子中使用apache进行反向代理的正确方法如下:

ProxyPassMatch    "/api(.*)" "http://localhost:9000/api$1"
ProxyPassReverse  "/api(.*)" "http://localhost:9000/api$1"

我知道我正在尝试的多个正则表达式示例是正确的,因为我用https://regex101.com/测试它们,但我很难编写特定路径的第二部分以消除第二部分的问题不正确,但由于某种原因,它不喜欢这样。一旦我理解了正则表达式的(。*)部分是第一个捕获组并在第二部分中将其用作$ 1,它就全部有效。

我希望我能够澄清答案,对其他人有用。