Подтвердить что ты не робот

Как сохранить фрагмент uri в сафари при перенаправлении?

В моем приложении gwt/gae используются действия и места. Чтобы создать асинхронные процессы (например, сброс пароля или подтверждение права собственности на адрес электронной почты), я использую шаблон, в котором состояние активности можно маркировать и хранить в хранилище данных, а затем извлекать и возобновлять позже. Чтобы получить токен состояния, у меня есть место, которое принимает расширенный идентификатор токена в качестве аргумента, извлекает его из хранилища данных, а затем переводит в нужное место по мере необходимости, чтобы возобновить процесс. Это позволяет мне создать ссылку на конкретное состояние моего приложения, которое может быть распространено по электронной почте. например:

http://mydomain.com/#signup:anJlbmZyb0BldGhvc2VkZ2UuY29tfDEzNzQxOTIxNjU3NjQ=

В этом случае вышеуказанная ссылка будет отправлена ​​на адрес электронной почты addres, используемый во время регистрации, и приложение возобновит активность регистрации, указанную аргументом хеша.

Все работает хорошо до недавнего времени, когда я добавил SSL-сертификат и принудительные https для всех запросов, добавив следующий код в мой web.xml:

<security-constraint>
    <web-resource-collection>
        <url-pattern>/*</url-pattern>
    </web-resource-collection>
    <user-data-constraint>
        <transport-guarantee>CONFIDENTIAL</transport-guarantee>
    </user-data-constraint>
</security-constraint>

Это ограничение обеспечивает https через (я считаю) 301 перенаправление на порт 443. Работает как очарование в Chrome, Firefox и IE.... однако сафари, похоже, отбрасывают фрагмент URL-адреса при перенаправлении... Я думаю, вы можете см. мою проблему! Как предотвратить удаление Safari фрагмента URL?

Обновление 8.1.13

После изнурительных исследований, я думаю, что я определил первопричину, но мне еще предстоит найти хорошее решение. Подробное описание проблемы было представлено в записке w3c Обработка идентификаторов фрагментов в перенаправленных URL-адресах (1999)

В основном, http spec неясно, как обрабатывать фрагменты URL во время перенаправления 3xx; и сафари решили отказаться от фрагмента при перенаправлении. См. Следующую ошибку bugzilla:

https://bugs.webkit.org/show_bug.cgi?id=24175

Желаемое поведение описывается проблемами w3c commun user agent:

http://www.w3.org/TR/cuap#uri

Итак, в свете всего этого, я считаю, что это проблема сафари (webkit). Я не понимаю, почему другие браузеры Webkit не затронуты? Известно ли обходное решение?

4b9b3361

Ответ 1

Просто выполните страницу перенаправления (200), которая обновляет window.location при загрузке и вводит хэш-фрагмент.

<!DOCTYPE html>
<meta charset="utf-8">
<html>
<body>
<script>
    var hash = (location.href.split("#")[1] || null);
    var pathField = "{{redirectUri}}";
    if (hash) {
        if (pathField.indexOf("#") == -1) {
            pathField = pathField + "#" + hash;
        }
    }
    window.location = pathField;
</script>
</body>
</html>

Таким образом, он работает с каждым браузером (по крайней мере, браузерами, поддерживающими javascript). {{redirectUri}} - это URL, к которому вы хотите перенаправить. Если он уже содержит фрагмент, он не будет перезаписан.