регулярное выражение в .htaccess для поддоменов

Дано:

Есть некий сайт, например, example.com и некоторые поддомены (city1.example.com, city2.example.com ... cityN.example.com ).

Для основного домена и для всех поддоменов есть набор файлов robots.txt и sitemap.xml, которые сгенерированы в следующем соответствии url'a и относительного пути к файлу:

example.com/robots.txt       -> /files/robots.txt  
city1.example.com/robots.txt -> /files/robots_city1.txt
...
cityN.example.com/robots.txt -> /files/robots_cityN.txt

Задача:

Написать универсальное правило в .htaccess для перенаправления запросов на соответствующие файлы по примеру выше.

В данный момент я использую такое правило:

RewriteCond %{HTTP_HOST} ^(m[-\.])?(.+)\.example\.com$ [NC]
RewriteRule ^(robots|sitemap)\.(txt|xml\.gz)$ $1_%2.$2
RewriteRule ^(robots|sitemap)(_\w+)?\.(txt|xml\.gz)$ - [L]

НО! Есть одна небольшая проблема - в нём явно указывается основной домен.

Данное правило предполагается использовать в некоем самописном PHP-движке и не хотелось бы для каждого нового сайта на этом движке явно указывать домен в .htaccess, тем более домен у сайта может поменяться в любом момент.

Я плохо соображаю в регулярных выражениях, поэтому прошу помочь, хотя бы натолкнуть на идею, в каком направлении думать?


Ответы (1 шт):

Автор решения: NoSkill

Ваше регулярное выражение заканчивается так, что явно используются имена доменов первого и второго уровня:

 \.example\.com$

Так как уровни доменов разделяются точками, то достаточно, чтобы регулярное выражение (для доменов первого и второго уровня) соответствовало любой строке с точкой вначале и еще одной точкой где-то посередине (и других точек в строке быть не должно):

\.[^.]+\.[^.]+$

Ежели нужно соответствие всем доменам высших уровней:

(\.[^.]+)+$

В полном варианте для вашей задачи (только для sub-доменов) будет так:

^(m[-\.])?([^.]+)(\.[^.]+)+$
→ Ссылка