переписывание 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, как я могу это остановить?

Настройка 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>Full Page 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 для перенаправления на другой домен без отображения нового URL

Введение

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

1. Использование .htaccess и URL-маршрутизация

Для достижения желаемого результата, если ваш хостинг предоставляет доступ к настройкам Apache, вы можете использовать .htaccess для написания правил, которые будут обрабатывать запросы на сервер. Однако стоит отметить, что простые переписывания с помощью RewriteRule будут всего лишь временными и не скроют конечный адрес.

Пример настройки в .htaccess:

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

В этом примере флаг [P] указывает на использование mod_proxy, что позволяет проксировать запрос на удаленный сервер.

2. Настройка ProxyPass в конфигурации Apache

Если у вас есть доступ к конфигурационному файлу Apache (httpd.conf или настройкам виртуального хоста), использование ProxyPass будет более надежным и прозрачным способом:

<VirtualHost *:80>
    ServerName www.somesite.com

    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
</VirtualHost>

Обратите внимание: Для использования этой функции необходимо убедиться, что модули mod_proxy и mod_proxy_http включены. Это можно сделать на основе системы, используя a2enmod для Ubuntu/Debian или yum для CentOS.

3. Обработка ссылок и редиректов

Настройка прокси может вызвать дополнительные сложности с URL-путями. Например, если удаленная страница содержит ссылки на другие ресурсы (изображения, CSS и JavaScript), они могут потребовать модификации. Используйте ProxyPassReverse для правильного отображения ссылок.

4. Альтернативные подходы

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

4.1 Использование <iframe>

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

<!DOCTYPE html>
<html lang="ru">
<head>
    <meta charset="UTF-8">
    <title>Моя первая страница с iframe</title>
    <style>
        html, body { margin: 0; padding: 0; height: 100%; }
        iframe { width: 100%; height: 100%; border: none; }
    </style>
</head>
<body>
    <iframe src="http://www.someothersite.com/blah/blah2/blah3/index.php?user=80338"></iframe>
</body>
</html>

4.2 Использование <frameset>

Хотя этот метод считается устаревшим, вы можете использовать <frameset> для визуализации удаленной страницы. Тем не менее, данный метод также покажет новый URL.

Заключение

Таким образом, если ваша цель состоит в скрытии нового URL, предпочтительным способом будет использование ProxyPass в конфигурации Apache, тогда как подходы с <iframe> или <frameset> не дадут желаемого результата. Убедитесь, что на вашем сервере установлены необходимые модули и что у вас есть доступ к их настройке. Рассмотрите возможность разработки сервера как более надежного и безопасного решения для долгосрочного использования.

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

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