
мне нужно переписать 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]
но они не сработали.
так... есть ли способ это сделать?
решение1
Вы не можете «переписать» 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
ссылка содержит поддомен (в данном примере «us» или «eg») из запрошенного имени хоста.
Дополнительным условием проверки строки запроса на отсутствие параметра country=
URL является предотвращение цикла перезаписи.
Однако вы ничего не указали о URL-пути? И вы должны переписывать напрямую в файл, который обрабатывает запрос ( index.php
?). В своем текущем состоянии указанное выше "переписывание" зависит от mod_dir, создающего дополнительный подзапрос для DirectoryIndex.
RewriteRule (US|EG) ?c=$1 [NC , L]
RewriteRule :\/\/(.*?).example.com ?C=$1 [NC , L]
В этих директивах есть многочисленные ошибки:
- Вы говорите, что пробовали это, однако, ошибочноепространствавфлагиаргумент приведет к немедленной внутренней ошибке сервера 500 при первом анализе файла.
- Как уже упоминалось выше,
RewriteRule
шаблон(первый аргумент) соответствует только URL-пути. Это не включает имя хоста. - Регулярное выражение в #1 слишком общее и соответствует «US» или «EG».в любом месте.
- Чтобы сопоставить абсолютный URL (что вы, по-видимому, пытаетесь сделать во втором примере), вам нужно будет сопоставить
THE_REQUEST
переменную сервера (которая содержит первую строку заголовков запроса, включая запросметод).