- Вопрос или проблема
- Обернуть запрос в ProxyPass
- Загрузить страницу в <iframe>
- Использовать старомодный <frameset>
- Ответ или решение
- URL Переписывание на другой домен с использованием .htaccess
- 1. Использование mod_proxy для обратного прокси
- 2. Использование .htaccess с флагом [P]
- 3. Использование <iframe> для загрузки контента
- 4. Заключение
Вопрос или проблема
У меня есть доступ к папке на веб-сервере, в которую я хотел бы поместить файл .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>
может выступить в роли временного решения. Не забывайте протестировать выбранный подход на предмет кросс-доменных политик безопасности и совместимости браузеров.