Как управлять URL с или без? а также /

В моем приложении Koa у меня есть такой маршрутизатор:

app
    .use(router(app))
    .all('/', frontRoutes.home.index);

Моя проблема в том, что:

  • мой домен.com
  • мой домен.com/
  • мой домен.com?

Проходят по одному и тому же маршруту. Это может быть здорово, но для Google это не так. Пишет, что это дублированный контент. Поэтому я хотел бы перенаправить первое и третье на второе. Что-то вроде этого:

app
    .use(router(app))
    .redirect('/\?', '/', 301)
    .redirect('', '/', 301)
    .all('/', frontRoutes.home.index);

Пробовали некоторые регулярные выражения без успеха. Уже открыл проблему Github, но тоже без ответа: https://github.com/alexmingoia/koa-router/issues/251 .

Заранее спасибо за помощь :)


person MathKimRobin    schedule 21.03.2016    source источник
comment
Кажется, что path-to-regexp по умолчанию привязывает значение, которое вы передаете как шаблон. Попробуйте выражение '\??'. Что-то вроде .redirect('\??', '/', 301).   -  person Wiktor Stribiżew    schedule 21.03.2016
comment
Кажется, ошибка не решается... Пробовал, не работает :( Спасибо за попытку помочь мне   -  person MathKimRobin    schedule 22.03.2016


Ответы (1)


С koa-router проблем нет. Вы можете сделать это с помощью простого старого промежуточного программного обеспечения:

// Redirects "/hello/world/" to "/hello/world"
function removeTrailingSlash () {
  return function * (next) {
    if (this.path.length > 1 && this.path.endsWith('/')) {
      this.redirect(this.path.slice(0, this.path.length - 1))
      return
    }
    yield * next
  }
}

// Redirects "/hello/world?" to "/hello/world"
function removeQMark () {
  return function * (next) {
    if (this.path.search === '?') {
      this.redirect(this.path)
      return
    }
    yield * next
  }
}

// Middleware

app.use(removeTrailingSlash())
app.use(removeQMark())
app.use(router(app))

// Routes

app
  .all('/', frontRoutes.home.index)

app.listen(3000)
person danneu    schedule 22.03.2016
comment
Есть небольшая ошибка, пришлось заменить this.path на this.originalUrl. Но все остальное работает, еще раз спасибо! - person MathKimRobin; 26.03.2016