Загружать содержимое iframe с помощью другого пользовательского агента
Можно ли загрузить iframe с помощью другого пользовательского агента? Использование мобильного агента пользователя для iframe поможет моему приложению показывать мобильные сайты как всплывающие окна.
Например, Google показывает страницу результатов мобильного поиска только в том случае, если пользовательский агент является мобильным.
Есть ли альтернативные решения или есть ли какие-либо риски безопасности, связанные с этой идеей?
Ответы
Ответ 1
Вы можете сделать это с помощью JavaScript:
navigator.__defineGetter__('userAgent', function(){
return 'foo' // customized user agent
});
navigator.userAgent; // 'foo'
Однако это будет работать только с выбранным количеством браузеров.
Смотрите этот вопрос: Издевательство над пользовательским агентом в javascript?
Ответ 2
Вы можете создать прокси-сервер, который обрабатывает запросы с другим пользовательским агентом, а затем загружать содержимое iframe через прокси-сервер.
Ответ 3
Прежде всего, вы должны создать функцию для изменения строки пользовательского агента:
function setUserAgent(window, userAgent) {
if (window.navigator.userAgent != userAgent) {
var userAgentProp = { get: function () { return userAgent; } };
try {
Object.defineProperty(window.navigator, 'userAgent', userAgentProp);
} catch (e) {
window.navigator = Object.create(navigator, {
userAgent: userAgentProp
});
}
}
}
Затем вам нужно настроить таргетинг на элемент iframe:
setUserAgent(document.querySelector('iframe').contentWindow, 'Aakash Chakravarthy Mobile Agent');
Вы также можете установить идентификатор в iframe и указать идентификатор вместо всех элементов iframe на странице.
Ответ 4
Из того, что я вижу, у вас есть два решения:
-
Большинство веб-сайтов не отображаются для каждого агента пользователя, они просто распознают пользовательский агент и перенаправляют пользователя на мобильный вид, доступный в другом домене (http://m.youtube.com/, например) или какой-либо другой сегмент URL. Вам просто нужно проверить их документацию, получить свой мобильный URL и загрузить его в iframe.
-
Другое решение - указать Iframe для вашего приложения, а затем извлечь документ из вашего бэкэнд. Затем вы можете изменить агент пользователя запроса.
Из HTML невозможно повлиять на заголовки запросов. Но вы можете сделать это с помощью javascript.
Ответ 5
Я предполагаю, что можно изменить только информацию агента пользователя для всего окна браузера или вкладки. Загружая фреймы в разное время, можно изменить агент пользователя между загрузками, чтобы получить два разных фрейма на одной странице с другим содержимым, связанным с пользовательским агентом. Я проверил это с помощью тривиальной страницы примера:
<!DOCTYPE html> <html> <body>
<iframe src="http://whatsmyuseragent.com/" name="mobile" width="60%" height="400px"></iframe>
<a href="#" onclick="location.href='http://whatsmyuseragent.com/'; return false;" target="mobile">Mobile Spoof</a>
<iframe src="http://whatsmyuseragent.com/" name="pc" width="60%" height="400px" ></iframe>
</body> </html>
После загрузки этой страницы в Firefox 36.0.1 я использовал расширение Switcher User Agent https://addons.mozilla.org/en-US/firefox/addon/user-agent-switcher/, чтобы выбрать iPhone 3.0, а затем щелкнул ссылку "Мобильный Spoof" для перезагрузки этого фрейма. В этот момент я увидел ту же страницу с другим пользовательским агентом в каждом iframe. Я уверен, что загрузка страницы или перезагрузка может быть автоматизирована с помощью метода setTimeout() или, возможно, с помощью обработчиков событий. Я не уверен, как автоматизировать переключатель агента пользователя. Я попробовал функцию setUserAgent, предложенную Aero Windwalker, но не смог заставить ее работать в Firefox 36 или Chrome 41. Я также хотел бы создать страницу, которая делает это хорошо.