Android http redirect url

How to get Android HttpURLConnection to handle a redirect

I’m making an app that basically downloads an image from the URL that I define and save it to the user’s device. I’m doing this with:

And then after checking that the storage is working properly and creating a blank file to save onto the device, I use a file output stream and an input stream to download the file to the device.

For testing purposes, I’ve just been using a Dropbox download link to an image and it’s been working perfectly. However, in production, I want to use a DNS subdomain redirect to link to the file, instead of a hardcoded link in my app so that I don’t have to update the app if I change the path to the file that the app needs to download.

For testing, I set a 301 redirect through my Godaddy DNS that redirects to the Dropbox link that I was using hardcoded for testing. The subdomain works perfectly when I enter the subdomain on my browser, but when I hardcore the subdomain URL into my app, nothing is downloaded and it just leaves behind a blank file (the one that was made after the request to be used to store the downloaded file).

I’ve tried using setFollowRedirects() and setting it to true, which I believe is the default but I tried anyway, and it still fails.

I thought maybe the issue was that the HttpURLConnection could not handle 301 response codes from the server, but I looked at the header of the Dropbox link and it 301 redirects the app a couple of times before downloading the file without issues.

Источник

java, android, resolve an url, get redirected uri

I have an authentication protected url : www.domain.com/alias

that when requested will return another url: www.another.com/resource.mp4 (not protected)

I would like to know if exists a method in Java that will return the real url from a given one. Something like: second = resolve(first)

I’m thinking of loading the first and try to read into the response maybe the location attribute, but since I’m not a java guru I would like to know if Java already faces this.

2 Answers 2

This is a problem i used to have concerning URL redirects. Try the following code:

The «magic» here happens in these 2 steps:

By default InstanceFollowRedirects are set to true, but you want to set it to false to capture the second URL. To be able to get that second URL from the first URL, you need to get the header field called «Location».

I have eliminated this issue on sites where we have a MikroTik router by using a Layer 7 protocol filter as shown below. This doesn’t help the devices off the WiFi network (obviously) but at least gives them some reprieve when they are connected to home and/or work WiFi networks.

Firstly, create the protocol definition:

Now, to actually filter this traffic out

Other firewalls that have Layer 7 filtering capacity could also block these redirects in a similar way.

Источник

Android WebViewClient url redirection (Android URL loading system)

I was trying intercept webview request using: ShouldInterceptRequest , inside it I used HttpUrlConnection to fetch data from server, I set it to follow the redirection, which is transparent to webviewclient. This means when I return WebResponseResource(«», «», data_inputstream), webview maynot know the target host was changed. How can I tell the webview this happened?

Читайте также:  Голосовой переводчик для android

If I request «google.com», it should be redirected to «google.co.uk», but webview didnt know the redirection, if the link of css file attaching with «co.uk» is «/render/something.css», the webview still go to «http://www.google.com/render/something.css» to find the css file which should be «http://www.google.co.uk/render/something.css».

Anyone can help me?

3 Answers 3

Certain metadata (url, headers, etc..) can’t be specified by the WebResourceResponse class. That means that you can only use shouldInterceptRequest to supply different data (change the page’s content) but you can’t use it to change the URL it’s being loaded at.

In your case you’re consuming the redirect within the HttpUrlConnection , so the WebView is still thinking that it’s loading «http://www.google.com/» (even if the content is coming from «http://google.co.uk/»). If Google’s home page doesn’t explicitly set a base URL the WebView will continue to assume the base URL is «http://www.google.com/» (since it hasn’t seen the redirect). Since relative resource references (like
) are resolved against the baseURL (which in this case is «http://www.google.com/» and not «http://www.google.co.uk/») you get the result you observed.

What you could do is use HttpUrlConnection to figure out whether the URL you’re going to load is a redirect and return null in that case. However I would strongly advise against using HttpUrlConnection from shouldInterceptRequest in general — the WebView’s network stack is much more efficient and will perform fetches in parallel (whereas using shouldInterceptRequest will serialize all of the loads in pre-KK WebViews).

Источник

Перенаправления в HTTP

URL перенаправление (redirecting), также известное как URL пересылка (forwarding), это метод представления страницы, формы или целого веб-приложения, более чем одним URL адресом. HTTP предоставляет специальный вид ответов, HTTP redirect, для выполнения этой операции, используемой для многих целей: временного перенаправления, пока выполняется обслуживание сайта, постоянное перенаправление, для сохранения работоспособности внешних ссылок, после смены архитектуры сайта, страниц прогресса, пока загружается файл, и так далее.

Принцип работы

В HTTP, перенаправление вызывается при отправке сервером специального ответа на запрос: redirects. HTTP перенаправление, это ответы с кодом статуса 3xx . Когда браузер получает ответ перенаправления, он использует новый предоставленный URL-адрес и немедленно загружает его: в большинстве случаев переадресация невидима для пользователя, за исключением небольшого влияния производительность.

Есть несколько типов перенаправлений и делятся на три категории: постоянные, временные и специальные перенаправления.

Постоянные перенаправления

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

Код Текст Обработка метода Случаи использования
301 Moved Permanently GET методы неизменны.
Другие методы могут быть превращены в GET . [1]
Реорганизация веб-сайта.
308 Permanent Redirect Метод и тело запроса неизменны. Реорганизация веб-сайта, с не-GET ссылками/операциями.

[1] Спецификация не была намерена разрешать изменение метода, но на практике, клиентские приложения делают это. Код 308 был создан чтобы избавиться от неоднозначности в поведении, при использовании не- GET методов.

Временные перенаправления

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

Код Текст Обработка метода Случаи использования
302 Found GET методы неизменны.
Другие методы могут быть превращены в GET . [2]
Веб-страница недоступна по непредвиденным причинам. В этом случае поисковые роботы не будут обновлять свои ссылки.
303 See Other GET методы неизменны.
Другие превращены в GET (тело запроса теряется).
Используется для перенаправления после PUT или POST для предотвращения обновления страницы, что может спровоцировать повторный вызов операции.
307 Temporary Redirect Метод и тело запроса неизменны. Веб-страница недоступна по непредвиденным причинам. В этом случае поисковые роботы не будут обновлять свои ссылки. Лучше чем код 302 когда не-GET ссылки/операции доступны на сайте.

[2] Спецификация не была намерена разрешать изменение метода, но на практике, клиентские приложения делают это. Код 307 был создан чтобы избавиться от неоднозначности в поведении, при использовании не- GET методов.

Специальные перенаправления

В добавок к обычным перенаправлениям, есть 2 специальные. Перенаправление с кодом 304 (Not Modified) перенаправляет страницу к локальной закешированной копии (которая была устаревшей), и перенаправление с кодом 300 (Multiple Choice) это ручное перенаправление: тело, представленное браузером, как веб-страница, перечисляет возможные перенаправления и пользователь выбирает одно из них.

Код Текст Случаи использования
300 Multiple Choice Не так много: варианты перечислены на HTML странице. Может быть обслужен со статусом 200 OK .
304 Not Modified Обновление кеша: означает, что значение кеша все ещё актуально и может быть использовано.

Альтернативные способы указания перенаправлений

HTTP перенаправления это не единственный способ переадресации. Есть ещё два метода: HTML перенаправления используют элемент , и JavaScript перенаправления используют DOM.

HTML перенаправления

HTTP перенаправления более предпочтительный способ создания перенаправлений, но, иногда, у веб-разработчиков нету контроля над сервером или возможности настроить его. Для таких особых случаев, разработчики могут создать HTML страницу с элементом и установить атрибуту http-equiv значение refresh в блоке . Когда страница отображается, браузер найдёт этот элемент и перейдёт на указанную страницу.

Атрибут content начинается с числа, которое означает, сколько секунд браузер должен ждать, прежде чем перейти по данной ссылке. Всегда устанавливайте 0, для лучшей доступности.

Очевидно, этот метод работает только с HTML страницами и не может использоваться для изображений или другого типа контента.

Заметьте, что перенаправления не позволяют работать должным образом кнопке «Назад» в браузере: вы можете вернуться на страницу назад, но мгновенно будете перенаправлены на страницу с которой пришли.

JavaScript перенаправления

Перенаправления в JavaScript создаются установкой значения свойства window.location и новая страница загрузиться.

Как и HTML перенаправления, этот тип не будет работать на всех ресурсах, и очевидно, что работает только на стороне клиента, который выполнит JavaScript. С другой стороны, вы можете вызвать перенаправление, только тогда, когда исполнится определённое условие.

Приоритетность

При использовании трёх возможных способов URL перенаправления, некоторые методы могут быть вызваны одновременно, но какой из них будет примёнён первым? Порядок приоритетов следующий:

  1. HTTP перенаправления всегда выполняются первыми, пока ещё страница даже не была передана, и конечно же, пока ещё не прочитана.
  2. HTML перенаправления ( ) выполняются только, если перенаправление не было в выполнено в HTTP.
  3. JavaScript перенаправления используются как последняя возможность перенаправления, и работают только если разрешено выполнение JavaScript на клиентской стороне.

Используйте HTTP перенаправления, когда это возможно, и не используйте элемент . Если разработчик изменяет HTTP перенаправление и забывает изменить HTML перенаправление , тогда они больше не идентичны, и закончится это вечным циклом или другим ночным кошмаром.

Случаи использования

Есть много случаев для использования перенаправлений, но поскольку они влияют на производительность, то должны использоваться как можно реже.

Связывание доменов

В идеале, есть только одно место, и следовательно один URL адрес, для одного ресурса. Но, есть несколько причин, чтобы иметь альтернативные имена для ресурса (несколько доменов, как с, так и без префикса www или более короткие и лёгкие для запоминания адреса, …). В этих случаях, использовать перенаправление к одному истинному URL адресу, более подходящий вариант, чем дублировать ресурс.

Связывание доменов может быть необходимым по нескольким причинам:

  • Расширение вашего сайта. Распространённый случай, когда ваш сайт находится под доменом www.example.com , а доступ к страницам должен быть возможным также из example.com . В этом случае создаются перенаправления для страниц из example.com к страницам www.example.com . Вы также можете предоставлять обычно используемые имена синонимов или частые опечатки ваших доменных имён.
  • Переезд на другой домен. К примеру, ваша компания была переименована и вы хотите чтобы люди которые обычно использовали старый сайт компании находили вас под новым именем.
  • Принуждённый HTTPS. Запросы к HTTP версии вашего сайта буду перенаправлены к HTTPS версии.

Сохранения ссылок рабочими

Когда вы изменяете структуру веб-сайта, URL адреса ресурсов меняются. Даже, если вы можете обновить внутренние ссылки вашего сайта в соответствии с новой схемой имён, у вас нет контроля на URL адресами используемыми внешними ресурсами. Вы не хотите, чтобы эти ссылки не работали, так как они приносят вам ценных пользователей (и помогают вашей SEO), так что вы устанавливаете перенаправления из старых URL адресов на новые.

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

Временные ответы для небезопасных запросов

Небезопасные запросы изменяют состояние сервера и пользователь не должен не нарочно запросить их. Обычно, вы не хотите чтобы ваши пользователи повторно отправляли PUT , POST или DELETE запросы. Если вы только обслуживаете запросы, простое нажатие кнопки перезагрузки повторно отправит запрос.

В этом случае, сервер вернёт ответ 303 (Смотреть другие), который будет содержать правильную информацию, но если кнопка перезагрузки будет нажата, эта страница просто отобразится повторно без ответа на небезопасный запрос.

Временные ответы на долгие запросы

Некоторые запросы могут потребовать больше времени сервера, например запрос DELETE , который срабатывает по расписанию. В этом случае, ответом будет перенаправление 303 (Смотреть другие), которое связывает со страницей показывающей, что действие было запланировано, и в результате информирует о процессе или позволяет отменить запрос.

Настройка перенаправлений на распространённых серверах

Apache

Перенаправления могут быть установлены или в настройках сервера, или в каждой директории в файле .htaccess .

У модуля mod_alias есть директивы Redirect и Redirect_Match которые, по умолчанию, устанавливают код ответа 302 :

URL http://example.com/ будет перенаправлен к http://www.example.com/ (но не к http://example.com/other.html )

Redirect_Match делает то же, но использует регулярное выражение, чтобы определить множество URL адресов, которые подпадут под эффект:

Все документы в папке images/ будут перенаправляться к другому домену.

Если вы не хотите устанавливать временное перенаправление, дополнительный параметр (используйте или код статуса HTTP, или ключевое слово permanent) может использоваться чтобы установить другое перенаправление:

Также модуль mod_rewrite может использоваться для создания перенаправлений. Они более гибкие, но сложнее в использовании.

Nginx

В Nginx, вы создаёте особый серверный блок для контента, который вы хотите перенаправлять:

Чтобы применить перенаправления к папке или подмножеству страниц, используйте директиву rewrite :

В IIS, вы используете элемент для настройки перенаправлений.

Циклы перенаправлений

Циклы перенаправлений случаются когда за успешным перенаправлением следует другое, которое уже было выполнено. Другими словами, существует такой цикл, который никогда не закончится и в конечном счёте ни одна страница не будет найдена.

В большинстве случаев это проблема сервера, и если сервер не может обнаружить её, то отправит код статуса 500 Internal Server Error . Если вы встретите такую ошибку вскоре после редактирования настроек сервера, то это скорее всего цикл перенаправлений.

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

тогда, как Chrome:

В обоих случаях, пользователь не может ничего сделать (в отличие от ошибки на стороне клиента, например, несоответствие файлов куки или кеша).

Важно избегать циклов перенаправлений, так как они полностью нарушают работу пользователя.

Источник

Читайте также:  Плей сторе для андроид
Оцените статью