NGINX переписать hashbang - PullRequest
       22

NGINX переписать hashbang

8 голосов
/ 21 марта 2011

Мне интересно, как будет выглядеть директива location или rewrite для URL-адресов hashbang (#!).По сути, все хеш-бэги проходят через хешбэнг как фронт-контроллер.Итак:

http://example.com/about/staff

будет направлен на

http://example.com/#!/about/staff

Мне не ясно, какой будет лучший метод здесь?Независимо от того, пишете ли оператор if, чтобы проверить существование hashbang, или просто переписываете, который фильтрует все запросы ...

Ответы [ 3 ]

11 голосов
/ 30 марта 2011

GET для идентификаторов фрагментов не / не должны (некоторые ошибочные клиенты могут отправлять их) появляются в HTTP-запросе, поэтому у вас не может быть правила перезаписи, соответствующего им, независимо от веб-сервера.

Механизм HTTP не может делать никаких предположений по этому поводу. Серверу даже не дано.

Если вы попытались сделать первоначальный запрос на / перенаправление на / #! вместо того, чтобы обслуживать корневой индекс, вы получите ошибку «слишком много перенаправлений», так как клиент вернется с запросом / снова (помните, что он не будет отправлять # с запросом). Вам нужно будет сделать это с помощью JavaScript вместо индексного документа .

Суть в том, что он не доступен на стороне сервера в запросе GET. Даже локон был пропатчен чтобы больше его не отправлять.

Вы можете иметь директивы определения местоположения nginx, чтобы все остальное попадало на фронт-контроллер:

 location = / {
  }      

  location = /index.html {
  }      

  location ~ / {
    rewrite ^ /#!$uri redirect;
    break;
  }

Остерегайтесь этого подхода, хотя; http://jenitennison.com/blog/node/154 дает гораздо больше подробностей о разгоне хэшбанга в Gawker и других проблемах, связанных с его использованием.

2 голосов
/ 20 марта 2012

Как модификация вышеупомянутого, я делаю это перенаправление только для определенных вызовов, и, таким образом, не получаю потенциальную обратную петлю:

location ~ /login|/logout|portfolios|/portfolio/*|/public/* {
  rewrite ^ /#!$uri permanent;
  break;
}

Обратите внимание, что это прекрасно работает во всех браузерах, кроме Safari.Safari перенаправит вас на URL без хэша.

0 голосов
/ 15 июня 2014

Лучший маршрут - использовать директиву try_files:

location {
    try_files $uri $uri/ /index.html;
}

Предполагается, что ваш файл index.html содержит логику javascript, которая направляет хэш к нужному ресурсу. URI останется тем, что запрашивал посетитель, тогда как Nginx просто перенаправит запрос в ваш индексный файл, когда не найдется реального файла, соответствующего запросу uri.

...