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]

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

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

1
задан 25 July 2019 в 11:29
1 ответ

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

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

Чтобы проверить субдомен на запрошенном хосте, вам нужно условие (директива RewriteCond ), которое проверяет соответствие HTTP_HOST ] серверная переменная (т. е. значение HTTP-заголовка запроса Host ). Шаблон 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») из запрошенного имя хоста.

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

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


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

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

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

Теги

Похожие вопросы