Я много искал и перепробовал много вещей, но мне так и не удалось найти способ сделать это именно так, как я этого хочу.

Без необходимости создавать Apache VirtualHost для каждого субдомена, а также с apache2 (предпочтительно), htaccess или DNS, я бы хотел перенаправить:

  • domain.xyz в domain.com
  • domain.xyz/* в domain.com/*
  • *.domain.xyz в *.domain.xyz (поэтому a.domain.xyz переходит на a.domain.com а b.domain.xyz на b.domain.com)
  • *domain.xyz/* to *.domain.com/*

Какой самый простой способ сделать это?

1 ответ1

0

Подход 1

Отказ от ответственности: я не пробовал этот первый подход, но я думаю, что он может сработать.

<VirtualHost *:80>
    RewriteEngine On
    RewriteCond %{HTTP_HOST} ^(.*)\.xyz$
    RewriteRule ^/(.*)$ http://%1.com/$1 [R=301,L]
</VirtualHost>

Итак, первый RewriteCond должен соответствовать HTTP_HOST который в основном будет вашим доменом, если он заканчивается на .xyz . Если это так, вы просто переписываете запрос в домен .com с тем же URI.

Подход 2

Есть и другой способ. Вы можете просто перенаправить любой запрос в статический PHP-файл и поместить исходный URL-адрес в качестве параметра в сценарий, а после вызова заменить URL-адрес на нужный домен. Это будет означать следующие изменения:

  1. Отредактируйте конфигурацию вашего apache и поместите что-то подобное внутри. Это было скопировано отсюда.

    RewriteEngine on
    
    RewriteCond %{REQUEST_FILENAME} !index.php
    RewriteRule .* index.php?url=$0 [QSA,L]
    

    Таким образом, любой запрос будет перенаправлен в файл index.php расположенный там, где вы определили директиву DocumentRoot .

  2. В этом файле вы бы сделали что-то вроде этого:

    <?php
       $url =  "http://$_SERVER[HTTP_HOST]$_SERVER[REQUEST_URI]";
       $escaped_url = htmlspecialchars($url, ENT_QUOTES, 'UTF-8');
    
       preg_match("/^http:\/\/(.*)\.xyz(.*)$/", $escaped_url, $matches);
       header("Location: http://{$matches[1]}.com{$matches[2]}");
    ?>
    

    Таким образом, вы просто сопоставляете исходный URL (хранящийся внутри $url) с регулярным выражением и меняете местоположение пользовательской функции (через header()) на тот же домен, но с другим TLD . Эта последняя попытка была проверена и работает хорошо.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .