Экспресс промежуточное ПО бесконечного цикла - PullRequest
0 голосов
/ 02 июля 2019

Промежуточное программное обеспечение Express работает в бесконечном цикле для закодированных URL-адресов, в моем URL-адресе присутствуют французские буквы, поэтому каждый раз, когда я пытаюсь найти что-то в URL-адресе, подобном /équipement

Экспресс-сервер работает в бесконечном циклепри попытке обработать URL (/%C3%A9quipement/), и я получаю ошибку ERR_TOO_MANY_REDIRECTS.

Это не происходит в моей локальной среде, происходит в среде разработки, размещенной в Azure, и на нем работает веб-сервер IIS..

Настроено 3 промежуточных ПО,

server.js

app.use(middlewares.ipcheck)
app.use('/:lang*', middlewares.redirection)
app.use(microcache.cacheSeconds(600, middlewares.microcache))

На основе журналов Azure код попадает в промежуточное ПО microcacheи затем возвращается к промежуточному программному обеспечению ipcheck.

ipcheck.js

  if (req.query.skipGeo || req.cookies.geoCheck || isBot(req)) {
    console.log(`Cookie Present \n`)
    let hour = 3600000
    res.cookie('geoCheck', 'passed', { maxAge: 365 * 24 * hour })
    next()
  } else {
    console.log(`Checking against mmdb \n`)
    const isValidIP = await user.hasValidIp(req.headers['x-forwarded-for'] || req.connection.remoteAddress)
    process.env.isValidIP = isValidIP
    if (!isValidIP) {
      console.log(`Geo Block \n`)
      res.status(307).sendFile(path.resolve('public/geo_block.html'))
    } else {
      console.log(`Success \n`)
      next()
    }
  }

microcache.js

return config.useMicroCache.get() && `${req.hostname}${req.originalUrl}` // useMicroCache is a bool val set based on env.

redirection.js

  const params = req.params
  let lang = params.lang
  const site = utils.user.currentSite(req)
  if (!req.originalUrl.includes('api')) {
    if (!validLanguage(site, lang)) {
      lang = req.cookies.lang && validLanguage(site, req.cookies.lang) ? req.cookies.lang : site.languages.default
      config.useMicroCache.set(false)
      res.redirect(301, `/${lang}${req.originalUrl}`)
      return
    } else if (lang !== req.cookies.lang) {
      config.useMicroCache.set(false)
    } else {
      config.useMicroCache.set(true)
    }

    if (!isLowerCase(req.path)) {
      let parsedUrl = url.parse(req.originalUrl)
      parsedUrl.pathname = parsedUrl.pathname.toLowerCase()
      res.redirect(301, url.format(parsedUrl))
      return
    }
  }

  next()
...