Назад | Перейти на главную страницу

htaccess перезаписать страну без поддоменов

мне нужно переписать URL из

us.example.com

к

example.com?country=us

без поддоменов

Я попробовал эти 2 правила:

1.

RewriteRule (US|EG) ?c=$1 [NC , L]

2.

RewriteRule :\/\/(.*?).example.com ?C=$1 [NC , L]

но они не работали.

так .. есть ли способ сделать это?

Вы не можете «переписать» URL-адрес для разных имен хостов (вам потребуется реализовать обратный прокси), и я предполагаю, что «перенаправление» нежелательно.

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

Для проверки поддомена на запрашиваемом хосте необходимо условие (RewriteCond директива), которая проверяет соответствие HTTP_HOST серверная переменная (т. е. значение Host Заголовок HTTP-запроса). В RewriteRule шаблон совпадает только с частью URL-пути URL-адреса.

Например:

RewriteEngine On

RewriteCond %{QUERY_STRING} !^country=
RewriteCond %{HTTP_HOST} ^(us|eg)\.example\.com [NC]
RewriteRule ^ /?country=%1 [L]

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

В %1 backreference содержит поддомен (в данном примере «us» или «eg») запрошенного имени хоста.

Дополнительное условие, которое проверяет строку запроса на отсутствие country= Параметр URL предназначен для предотвращения цикла перезаписи.

Однако вы ничего не указали про URL-путь? И вы должны переписывать прямо в файл, обрабатывающий запрос (index.php?). В своем текущем состоянии вышеуказанная «перезапись» зависит от того, что mod_dir делает дополнительный подзапрос для DirectoryIndex.


  1. RewriteRule (US|EG) ?c=$1 [NC , L]
  2. RewriteRule :\/\/(.*?).example.com ?C=$1 [NC , L]

Эти директивы содержат множество ошибок:

  • Вы говорите, что пробовали эти ошибочные пробелы в флаги при первом анализе файла приведет к немедленной ошибке 500 Internal Server Error.
  • Как упоминалось выше, RewriteRule шаблон (первый аргумент) соответствует только URL-пути. Это не включает имя хоста.
  • Регулярное выражение в №1 слишком общее и соответствует "US" или "EG" везде.
  • Чтобы сопоставить с абсолютным URL-адресом (как вы, кажется, пытаетесь сделать во втором примере), вам необходимо сопоставить с THE_REQUEST переменная сервера (которая содержит первую строку заголовков запроса, включает запрос метод).