Я думаю, что достиг святого Грааля общего перенаправления субдоменов с подстановочными знаками после того, как целый день ходил по кругу, борясь с ошибками «слишком много перенаправлений». Похоже, он работает с любым доменом и поддоменом, единственная часть, которую вам нужно указать, — это список возможных допустимых суффиксов, например, .com|.com.au|.co.uk и т. д. Этот код примет *yourdomain.suffix
для любого домена и превратит его в http://www.yourdomain.suffix
, но только для действительных поддоменов, которые могут существовать на самом деле. Вы можете иметь столько последовательностей anything.anything-anything.anything-anything-anything.anything.
перед yourdomain.com
, сколько хотите, и все они превратятся в www. Теперь он кажется отлично работающим, но я ни на йоту не доверяю этому садистскому языку регулярных выражений. У меня нет абсолютно никакой возможности узнать, действителен ли этот код, вызовет ли он проблемы с сервером или сбой при каких-то важных обстоятельствах. Может ли кто-нибудь помочь проверить или улучшить его?
Вот:
RewriteCond %{HTTP_HOST} ^([a-zA-Z0-9]+[a-zA-Z0-9\-]*[a-zA-Z0-9]+[\.]{1}|[a-zA-Z0-9]+[\.]{1})*([a-zA-Z0-9]+[a-zA-Z0-9\-]*[a-zA-Z0-9]+|[a-zA-Z0-9]+)\.(com|com[\.]{1}au)?$ [NC]
RewriteCond %{HTTP_HOST} !^www\.([a-zA-Z0-9]+[a-zA-Z0-9\-]*[a-zA-Z0-9]+|[a-zA-Z0-9]+)\.(com|com[\.]{1}au)?$ [NC]
RewriteRule .? http://www.%2.%3%{REQUEST_URI} [R=302,NC,L]
Примечание. Причина, по которой он такой длинный, заключается в том, что я пытаюсь учесть возможность использования тире в частях основного домена или поддомена. Итак, anything-anything.youdomain.com
. Но я читал, что в доменных именах нельзя использовать тире без хотя бы одного буквенно-цифрового символа между тире и любой точкой. Таким образом, www.anything-.yourdomain.com или www.-anything.yourdomain.com являются недействительными и должны быть отклонены. Если бы мне не нужно было это учитывать, регулярное выражение для первых двух строк было бы намного проще: оно могло бы просто начинаться с:
RewriteCond %{HTTP_HOST} ^([a-zA-Z0-9\-]+[\.]{1})*([a-zA-Z0-9\-]+)\.(com|com[\.]{1}au)?$