Сопоставление доменов с регулярным выражением для lighttpd mod_evhost (www.domain.com/domain.com/sub.domain.com)

Я играю с http://en.wikipedia.org/wiki/Lighttpd на небольшом виртуальном частном сервере. У меня два домена указывающих на сервер. Я использую последнюю версию lighttpd и mod_evhost в Ubuntu 8.10.

  1. Я пытаюсь настроить правило, чтобы если кто-либо запрашивает domain.com или www.domain.com, он обслуживался с /webroot/domain.com. /www/

  2. Точно так же, если кто-либо запрашивает sub.domain.com, он получает доступ из /webroot/domain.com/sub/.

  3. Если люди запрашивают fake.domain.com (где /webroot/domain.com/fake/ не существует), я бы хотел, чтобы они обслуживались из /webroot/domain. .com/www/

Третье требование не столь важно, я могу иметь дело с людьми, запрашивающими субдомены, которые не существуют, которые обслуживаются из корня документа сервера /webroot/server.com/www/, даже если они запросили fake.domain.com

Я включил соответствующие части моего файла lighttpd.conf ниже:

server.document-root = "/webroot/server.com/www/"

// regex to match sub.domain.com
$HTTP["host"] =~ "\b[a-zA-Z]\w*\.\b[a-zA-Z]\w*\.\b[a-zA-Z]\w*" {
    evhost.path-pattern = "/webroot/%0/%3/"    
}

// regex to match domain.com    
$HTTP["host"] =~ "\b[a-zA-Z]\w*\.\b[a-zA-Z]\w*" {
    evhost.path-pattern = "/webroot/%0/www/"    
}

Так где я ошибаюсь? На данный момент все запросы к *.domain.com и domain.com обслуживаются с /webroot/domain.com/www/.

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

Привет, Роб


person Rob Burke    schedule 04.11.2008    source источник
comment
Я изменил свой ответ, чтобы адаптировать его к вашему (необязательному) требованию № 3. Я не могу его проверить, поэтому не могли бы вы попробовать, если это сработает?   -  person Tomalak    schedule 04.11.2008


Ответы (2)


Ваши регулярные выражения кажутся немного преувеличенными.

Вот что я бы использовал:

// regex to match sub.domain.com
$HTTP["host"] =~ "^[^.]+\.[^.]+\.[^.]+$" {
    evhost.path-pattern = "/webroot/%0/%3/"    
}

// regex to match domain.com    
$HTTP["host"] =~ "^[^.]+\.[^.]+$" {
    evhost.path-pattern = "/webroot/%0/www/"    
}

куда:

[^.]+ matches anything but a dot, 1..n times

Чтобы сопоставить только действительные поддомены с возвратом к «www», вы можете использовать это:

// default: route everything to "www"
$HTTP["host"] =~ "([^.]+\.)?domain\.com$" {
    evhost.path-pattern = "/webroot/%0/www/"
}

// specific regex overwrites "path-pattern" for valid sub-domains only
$HTTP["host"] =~ "^(valid1|valid2|sub)\.domain\.com$" {
    evhost.path-pattern = "/webroot/%0/%3/"    
}
person Tomalak    schedule 04.11.2008
comment
Разве не является плохой практикой создание регулярного выражения, которое будет соответствовать недопустимым символам URL? - person Anders; 04.11.2008
comment
Было бы тривиально изменить регулярное выражение, чтобы оно соответствовало только действительным доменам. Я вставлю еще один кусок кода для иллюстрации. - person Tomalak; 04.11.2008
comment
Кроме того: если этот код работает, запросы поступили на ваш сервер. Скорее всего, в их заголовке хоста не будет недопустимых символов. - person Tomalak; 04.11.2008
comment
@Tomalak Я бы беспокоился о намеренном использовании недопустимых символов для злонамеренных целей, таких как «/» или «..». Хотя, проверяя это, lighttpd отклоняет эти запросы как неверные, так что это не должно быть проблемой. - person Julia Path; 21.04.2020
comment
@jpath Это зависит от используемого HTTP-сервера, но я не удивлюсь, если у большинства из них есть какая-то встроенная защита от обхода пути. Но никогда не помешает перепроверить или перестраховаться с регулярным выражением. - person Tomalak; 21.04.2020

Для вашего первого, совпадающего с domain.com и www.domain.com: ^\b([wW]{3}\.)?[\w\d]*\.com\b$, а для второго я не уверен, может ли регулярное выражение определить, является ли поддомен/страница существует, так как он предназначен для идентификации строк интересующего текста. Надеюсь, это вам немного поможет.

person Anders    schedule 04.11.2008