是否可以在Azure静态Web应用中使用通配符重定向?

tzcvj98z  于 2023-01-05  发布在  其他
关注(0)|答案(2)|浏览(104)

我尝试将API调用从静态Web应用重定向到另一个函数应用,但无法使用通配符。
路由匹配正确,但我希望*部分包含在重定向中。这是我的staticwebapp.config.json中的一个示例

{
        "route": "/api/client/*",
        "redirect": "https://xx.yy.net/api/client/*"
  }

我希望将请求/api/client/customer/get?customerId=xx变为https://xx.yy.net/api/client/customer/get?customerId=xx
但是无论我怎么尝试,它都很难准确地路由到我在重定向中放置的内容。对于函数,这在代理中是可能的,但我在静态Web应用程序中找不到方法。

m2xkgtsf

m2xkgtsf1#

有点晚了,但在我的例子中,可以从头中获得原始URL:

if (shortUrl == "*")
        {
            var original = req.Headers
                .FirstOrDefault(h => h.Key.ToLower() == "x-ms-original-url")
                .Value.FirstOrDefault()?.ToString();
            if (string.IsNullOrWhiteSpace(original))
            {
                shortUrl = "";
            }
            else
            {
                shortUrl = original.Split("/")
                    .Where(p => !string.IsNullOrWhiteSpace(p))?
                    .LastOrDefault() ??"";
            }
        }
vxf3dgd4

vxf3dgd42#

有一种方法可以使用内置函数应用程序支持的动态重定向。您的staticwebapp.config.json需要:

"navigationFallback": {
    "rewrite": "/api/fallback"
  }

以及处理重定向的fallback函数;就像这样:

//@ts-check
const { parseURL } = require('ufo');
const routes = require('./redirects');

/**
 *
 * @param { import("@azure/functions").Context } context
 * @param { import("@azure/functions").HttpRequest } req
 */
async function fallback(context, req) {
  const originalUrl = req.headers['x-ms-original-url'];
  if (originalUrl) {
    // This URL has been proxied as there was no static file matching it.
    context.log(`x-ms-original-url: ${originalUrl}`);

    const parsedURL = parseURL(originalUrl);

    const matchedRoute = routes.find((route) =>
      parsedURL.pathname.includes(route.route)
    );

    if (matchedRoute) {
      context.log(`Redirecting ${originalUrl} to ${matchedRoute.redirect}`);

      context.res = {
        status: matchedRoute.statusCode,
        headers: { location: matchedRoute.redirect },
      };
      return;
    }
  }

  context.log(
    `No explicit redirect for ${originalUrl} so will redirect to 404`
  );

  context.res = {
    status: 302,
    headers: {
      location: originalUrl
        ? `/404?originalUrl=${encodeURIComponent(originalUrl)}`
        : '/404',
    },
  };
}

module.exports = fallback;

您可以在这里获得很大的灵活性来实现您想要的任何解决方案;包括通配符
下面有更深入的解释:https://johnnyreilly.com/2022/12/22/azure-static-web-apps-dynamic-redirects-azure-functions

相关问题