Переписывание URL на другой домен

Вопрос или проблема

У меня есть доступ к папке на веб-сервере, в которую я хотел бы поместить файл .htaccess, чтобы при посещении пользователем www.somesite.com/myfolder/index.html отображалось содержимое страницы на другом домене www.someothersite.com/blah/blah2/blah3/index.php?user=80338

У этого URL ужасно длинный, и у меня нет доступа к этой папке. Тем не менее, я не хочу, чтобы пользователь видел этот URL в своем браузере, это должно происходить за кулисами – я попытался прочитать несколько учебников о вебе, и вот что у меня получилось в директории myfolder:

RewriteEngine On
RewriteRule ^index\.html$ http://www.someothersite.com/blah/blah2/blah3/index.php?user=80338 [QSA,L]

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

Настройка ProxyPass работает, но я недавно обнаружил, что можно сделать что-то подобное с помощью переписывания.

Использование флага [P] в конце вашего RewriteRule заставит переписывание обрабатываться mod_proxy.

Простой пример будет выглядеть как-то так:

RewriteRule ^(.*)$ http://www.example.com/$1 [P]

Любое внешнее перенаправление 301 или 302 на другую страницу будет отображаться как текущее местоположение в адресной строке браузера. Чтобы добиться желаемого результата, вы должны сохранить текущий родительский документ в качестве вашего локального index.html. Таким образом, у вас есть несколько вариантов сделать это (это, вероятно, не полный список).


Обернуть запрос в ProxyPass

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

Чтобы скрыть перенаправление от клиента, вам нужно будет проксировать запрос в файле httpd.conf для вашего VirtualHost следующим образом:

<Location /index.html>
    ProxyPass http://www.someothersite.com/blah/blah2/blah3/index.php?user=80338
</Location>

Чтобы включить вышеуказанные директивы, вам нужно будет установить и активировать модуль Apache mod_proxy_http, который зависит от системы (например, yum, apt, a2enable).

Тем не менее, у вас возникнут некоторые интересные проблемы с отображением URL, которые придется решать в каждом случае, поэтому чтобы это работало прозрачно, потребуется приложить некоторые усилия.

Например, это зависит от того, как ссылки в вашем удаленном документе указаны: относительные или полные/абсолютные. Вы можете исправить каждую ссылку и URL, используя правила ProxyPassReverse и mod_substitute.


Загрузить страницу в <iframe>

Вы можете использовать <iframe> (или старомодный <frame>), который будет отображаться с использованием нового URL в адресной строке браузера. Чтобы загрузить удаленный документ в <iframe>, вы можете использовать что-то вроде этого:

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" 
 "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" lang="EN">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>Полная страница IFrame</title>
<style type="text/css">
html {overflow: auto;}
html, body, div, iframe {margin: 0px; padding: 0px; height: 100%; border: none;}
iframe {display: block; width: 100%; border: none; overflow-y: auto; overflow-x: hidden;}
</style>
</head>
<body>
<iframe id="tree" name="tree" src="http://www.someothersite.com/blah/blah2/blah3/index.php?user=80338" 
 frameborder="0" marginheight="0" marginwidth="0" 
 width="100%" height="100%" scrolling="auto"></iframe>
</body>
</html>

Использовать старомодный <frameset>

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Frameset//EN" "http://www.w3.org/TR/html4/frameset.dtd">
<html>
<head><title>Моя первая страница с фреймом</title>
</head>
<frameset cols="100%">
<frame src="http://www.page3.com">
</frameset>
</html>

Ответ или решение

URL Переписывание на другой домен с использованием .htaccess

Когда вам необходимо перенаправить запросы с одного домена на другой без изменения URL в адресной строке пользователя, вы можете воспользоваться механизмом переписывания URL в Apache. В зависимости от стоящих задач, существуют различные подходы для достижения желаемого результата. Ниже приведены наиболее эффективные методы.

1. Использование mod_proxy для обратного прокси

Чтобы скрыть конечный URL от пользователя, наиболее элегантным решением является настройка обратного прокси с помощью mod_proxy. Однако этот вариант требует, чтобы вы имели доступ к конфигурационному файлу сервера, что не всегда возможно для пользователей.

Конфигурация в httpd.conf:

<IfModule mod_proxy.c>
    ProxyPass /myfolder/index.html http://www.someothersite.com/blah/blah2/blah3/index.php?user=80338
    ProxyPassReverse /myfolder/index.html http://www.someothersite.com/blah/blah2/blah3/index.php?user=80338
</IfModule>

В этой конфигурации, когда пользователь заходит по адресу www.somesite.com/myfolder/index.html, ему будет отображаться содержимое страницы из другого домена. Однако нужно помнить, что вам может понадобиться правильно настроить заголовки и другие параметры, чтобы избежать проблем с кросс-доменным доступом.

2. Использование .htaccess с флагом [P]

Если у вас нет доступа к httpd.conf, но вы можете создать файл .htaccess в директории вашего веб-приложения, вы можете использовать следующую конфигурацию:

RewriteEngine On
RewriteRule ^index\.html$ http://www.someothersite.com/blah/blah2/blah3/index.php?user=80338 [P,L]

Здесь флаг [P] означает, что запрос будет обработан как прокси-запрос, что также скрывает адрес конечного URL от клиента.

3. Использование <iframe> для загрузки контента

Если указанные выше варианты вам не подходят и вам нужно быстрое решение, вы можете использовать HTML-элемент <iframe>. Однако этот метод имеет свои ограничения, так как URL конечного ресурса будет отображаться в адресной строке:

<!DOCTYPE html>
<html lang="ru">
<head>
    <meta charset="UTF-8">
    <title>Загрузка через Iframe</title>
    <style>
        html, body {
            margin: 0;
            height: 100%;
            width: 100%;
        }
        iframe {
            border: none;
            width: 100%;
            height: 100%;
        }
    </style>
</head>
<body>
    <iframe src="http://www.someothersite.com/blah/blah2/blah3/index.php?user=80338"></iframe>
</body>
</html>

Этот метод прост в реализации, но не идеален с точки зрения пользовательского опыта.

4. Заключение

Выбор правильного метода зависит от вашего доступа к серверным настройкам и требований вашего проекта. Использование mod_proxy с httpd.conf или .htaccess — наиболее предпочтительные способы, так как они надежно скрывают реальный адрес от пользователей. Однако если доступ к этим настройкам ограничен, <iframe> может выступить в роли временного решения. Не забывайте протестировать выбранный подход на предмет кросс-доменных политик безопасности и совместимости браузеров.

Оцените материал
Добавить комментарий

Капча загружается...