регулярное выражение в .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 шт):
Ваше регулярное выражение заканчивается так, что явно используются имена доменов первого и второго уровня:
\.example\.com$
Так как уровни доменов разделяются точками, то достаточно, чтобы регулярное выражение (для доменов первого и второго уровня) соответствовало любой строке с точкой вначале и еще одной точкой где-то посередине (и других точек в строке быть не должно):
\.[^.]+\.[^.]+$
Ежели нужно соответствие всем доменам высших уровней:
(\.[^.]+)+$
В полном варианте для вашей задачи (только для sub-доменов) будет так:
^(m[-\.])?([^.]+)(\.[^.]+)+$