Я использую S3 для размещения приложения JavaScript, которое будет использовать push5tates HTML5. Проблема в том, что если пользователь добавит в закладки какой-либо из URL-адресов, он ни к чему не приведет. Что мне нужно, так это возможность принимать все URL-запросы и обслуживать корневой index.html в моем контейнере S3, а не просто выполнять полное перенаправление. Тогда мое приложение javascript могло бы проанализировать URL и предоставить нужную страницу.
Есть ли какой-нибудь способ сказать S3 обслуживать index.html для всех URL-запросов вместо того, чтобы делать перенаправления? Это было бы похоже на настройку apache для обработки всех входящих запросов путем предоставления одного index.html, как в этом примере: https://stackoverflow.com/a/10647521/1762614 . Я действительно хотел бы избежать запуска веб-сервера только для обработки этих маршрутов. Делать все из S3 очень привлекательно.
Ответы:
С помощью CloudFront очень легко решить эту проблему без URL-хаков.
источник
Я смог заставить это работать следующим образом:
В разделе « Изменить правила перенаправления» консоли S3 для своего домена добавьте следующие правила:
Это перенаправит все пути, в результате которых 404 не найден в ваш корневой домен с версией хеш-взрыва пути. Поэтому http://yourdomainname.com/posts будет перенаправлять на http://yourdomainname.com/#!/posts при условии, что в / posts отсутствует файл.
Однако, чтобы использовать pushStates в HTML5, нам нужно принять этот запрос и вручную установить правильное pushState на основе пути хеш-взрыва. Так что добавьте это в начало вашего файла index.html:
Это захватывает хэш и превращает его в push5-состояние HTML5. С этого момента вы можете использовать pushStates, чтобы в вашем приложении были пути без хэша.
источник
<script language="javascript"> if (typeof(window.history.pushState) == 'function') { window.history.pushState(null, "Site Name", window.location.hash.substring(2)); } else { window.location.hash = window.location.hash.substring(2); } </script>
react-router
этим решением, используя push5tates HTML5 и<ReplaceKeyPrefixWith>#/</ReplaceKeyPrefixWith>
Есть несколько проблем с подходом на основе S3 / Redirect, упомянутых другими.
Решение:
Настройте правила страницы ошибок для своего экземпляра Cloudfront. В правилах ошибок укажите:
Код ответа HTTP: 200
Сконфигурируйте экземпляр EC2 и настройте сервер nginx.
Я могу помочь более подробно в отношении настройки nginx, просто оставьте записку. Выучил это трудным путем.
После обновления распределения фронта облака. Сделайте недействительным свой кэш облачного фронта один раз, чтобы быть в первозданном режиме. Хит URL в браузере, и все должно быть хорошо.
источник
If-Modified-Since
запрос GET отправляется источнику) - может быть полезным для людей, не желающих настроить сервер как в шаге 5.Это тангенциально, но вот совет для тех, кто использует библиотеку Rackt React Router с (HTML5) историей браузера и хочет разместить на S3.
Предположим, что пользователь заходит
/foo/bear
на ваш статический веб-сайт, размещенный на S3. Учитывая более раннее предложение Дэвида , правила перенаправления отправят их . Если ваше приложение построено с использованием истории браузера, это не принесет много пользы. Однако в этот момент ваше приложение загружено, и теперь оно может манипулировать историей./#/foo/bear
Включив историю Rackt в наш проект (см. Также раздел « Использование пользовательских историй из проекта React Router»), вы можете добавить прослушиватель, который знает пути к истории хеша, и при необходимости заменить путь, как показано в этом примере:
Подведем итог:
/foo/bear
на/#/foo/bear
.#/foo/bear
запись истории.Link
теги будут работать как положено, как и все другие функции истории браузера. Единственный недостаток, который я заметил, это промежуточное перенаправление, которое происходит при первоначальном запросе.Это было вдохновлено решением для AngularJS , и я подозреваю, что его можно легко адаптировать к любому приложению.
источник
browserHistory.listen
Я вижу 4 решения этой проблемы. Первые 3 уже были охвачены в ответах, и последний - мой вклад.
Установите документ об ошибке в index.html.
Проблема : тело ответа будет правильным, но код состояния будет 404, что вредит SEO.
Установите правила перенаправления.
Проблема : URL-адрес загрязнен
#!
и страница мигает при загрузке.Настройте CloudFront.
Проблема : все страницы будут возвращать 404 от источника, поэтому вам нужно выбрать, если вы не будете кэшировать что-либо (TTL 0 в соответствии с предложением) или если вы будете кэшировать и иметь проблемы при обновлении сайта.
Предварительно отобразить все страницы.
Проблема : дополнительная работа по предварительному отображению страниц, особенно когда страницы часто меняются. Например, новостной сайт.
Я предлагаю использовать вариант 4. Если вы предварительно отобразите все страницы, на ожидаемых страницах не будет 404 ошибок. Страница будет загружена нормально, а фреймворк получит контроль и будет действовать как SPA. Вы также можете настроить документ ошибок для отображения общей страницы error.html и правила перенаправления для перенаправления ошибок 404 на страницу 404.html (без хеш-бенга).
Что касается 403 Запрещенных ошибок, я не позволяю им случиться вообще. В моем приложении, я считаю , что все файлы в принимающем ведре являются открытыми , и я установить это с каждым вариантом с чтением разрешения. Если на вашем сайте есть страницы, которые являются частными, разрешение пользователю видеть макет HTML не должно быть проблемой. Вам нужно защитить данные, и это делается в бэкэнде.
Кроме того, если у вас есть личные ресурсы, такие как пользовательские фотографии, вы можете сохранить их в другом ведре. Потому что частные активы требуют такой же заботы, как и данные, и их нельзя сравнивать с файлами активов, которые используются для размещения приложения.
источник
Сегодня я столкнулся с той же проблемой, но решение @ Mark-Nutter было неполным, чтобы удалить хэш-бэнг из моего приложения angularjs.
Фактически, вам нужно перейти в « Редактировать разрешения» , нажать « Добавить дополнительные разрешения», а затем добавить правильный список в вашем списке для всех. С этой конфигурацией AWS S3 теперь сможет возвращать ошибку 404, а затем правило перенаправления правильно поймает случай.
Именно так :
А затем вы можете перейти к « Изменить правила перенаправления» и добавить это правило:
Здесь вы можете заменить имя_узла subdomain.domain.fr своим доменом и KeyPrefix #! /, Если вы не используете метод hashbang для целей SEO.
Конечно, все это будет работать, только если у вас уже есть настройка html5mode в вашем угловом приложении.
источник
Самым простым решением сделать приложение Angular 2+ из Amazon S3 и работающих прямых URL-адресов является указание index.html как документов Index и Error в конфигурации S3 Bucket.
источник
body
ответа. Код статуса будет 404, и это повредит SEO.body
случае, если у вас есть какие-либо скрипты, которые вы импортируете вhead
них, они не будут работать, когда вы напрямую попадете на любой из суб-маршрутов на вашем сайтетак как проблема все еще существует, я, хотя и добавляю другое решение. Мой случай состоял в том, что я хотел автоматически развернуть все pull-запросы на s3 для тестирования перед слиянием, сделав их доступными на [mydomain] / pull-запросы / [pr номер] /
(например, www.example.com/pull-requests/822/ )
Насколько мне известно, ни один из сценариев правил s3 не позволил бы иметь несколько проектов в одном сегменте с использованием маршрутизации html5, поэтому, хотя предложение с наибольшим количеством голосов работает для проекта в корневой папке, оно не подходит для нескольких проектов в собственных подпапках.
Поэтому я указал свой домен на свой сервер, где следующий конфиг nginx сделал свою работу
он пытается получить файл и, если не найден, предполагает, что это маршрут html5, и пытается это сделать. Если у вас есть угловая страница 404 для не найденных маршрутов, вы никогда не доберетесь до @not_found и получите угловую страницу 404, а не найденные файлы, которые можно исправить с помощью некоторого правила if в @get_routes или чего-то подобного.
Я должен сказать, что я не чувствую себя слишком комфортно в области конфигурации nginx и использования регулярных выражений в этом отношении, я получил это, работая с пробой и ошибкой, так что пока это работает, я уверен, что есть место для улучшения, и, пожалуйста, поделитесь своими мыслями ,
Примечание : удалите правила перенаправления s3, если они были в конфигурации S3.
и кстати работает в сафари
источник
Искал такую же проблему. В итоге я использовал набор предложенных решений, описанных выше.
Во-первых, у меня есть корзина s3 с несколькими папками, каждая папка представляет собой сайт реакции / редукции. Я также использую cloudfront для аннулирования кэша.
Поэтому мне пришлось использовать правила маршрутизации для поддержки 404 и перенаправить их в конфигурацию хэша:
В моем коде js мне нужно было обработать его с помощью
baseName
config для реакции-маршрутизатора. Прежде всего, убедитесь, что ваши зависимости совместимы, я установил, сhistory==4.0.0
которым был несовместимreact-router==3.0.1
.Мои зависимости:
Я создал
history.js
файл для загрузки истории:Этот фрагмент кода позволяет обрабатывать 404, отправленные сервером, с помощью хэша и заменять их в истории для загрузки наших маршрутов.
Теперь вы можете использовать этот файл для настройки вашего хранилища и вашего корневого файла.
Надеюсь, поможет. Вы заметите, что в этой конфигурации я использую редукторный инжектор и доморощенный саговый инжектор для асинхронной загрузки javascript через маршрутизацию. Не возражайте против этих строк.
источник
Теперь вы можете сделать это с помощью Lambda @ Edge, чтобы переписать пути
Вот рабочая лямбда-функция Edge:
В вашем поведении облачного фронта вы отредактируете его, добавив вызов этой лямбда-функции в «Запрос зрителя»
Полное руководство: https://aws.amazon.com/blogs/compute/implementing-default-directory-indexes-in-amazon-s3-backed-amazon-cloudfront-origins-using-lambdaedge/
источник
return callback(null, request);
Если вы попали сюда в поисках решения, которое работает с React Router и AWS Amplify Console - вы уже знаете, что не можете напрямую использовать правила перенаправления CloudFront, поскольку Amplify Console не предоставляет CloudFront Distribution для приложения.
Решение, однако, очень простое - вам просто нужно добавить правило перенаправления / перезаписи в Amplify Console следующим образом:
Смотрите следующие ссылки для получения дополнительной информации (и правила для копирования на скриншоте):
источник
Я искал ответ на это сам. Похоже, что S3 поддерживает только перенаправления, вы не можете просто переписать URL-адрес и молча вернуть другой ресурс. Я рассматриваю возможность использования моего скрипта сборки, чтобы просто сделать копии моего index.html во всех необходимых местах пути. Может быть, это будет работать для вас тоже.
источник
Просто чтобы поставить предельно простой ответ. Просто используйте стратегию определения местоположения хэша для маршрутизатора, если вы размещаете на S3.
экспорт const AppRoutingModule: ModuleWithProviders = RouterModule.forRoot (маршруты, {useHash: true, scrollPositionRestoration: 'enabled'});
источник