Apache RewriteRule для хоста в папку [дубликат]

Использование не-жадных кванторов здесь, вероятно, является лучшим решением, также потому, что оно более эффективно, чем жадная альтернатива: жадные совпадения обычно идут насколько это возможно (здесь, до конца текста!), а затем отслеживать назад символ после символа, чтобы попытаться совместить часть, идущую позже.

Однако рассмотрите вместо этого использование отрицательного символьного класса:

Project name:\s+(\S*)\s+J[0-9]{7}:

\S означает «все, кроме пробелов, и это это именно то, что вы хотите.

15
задан Connor Deckers 12 April 2013 в 12:27
поделиться

1 ответ

Есть 2 вещи, которые вы делаете неправильно здесь.

Во-первых, ваше регулярное выражение %{HTTP_HOST} не подходит. Вам нужно избегать точек ., иначе они будут рассматриваться как «любой символ, который не является символом новой строки». Это по существу делает обратную ссылку %3 последним символом имени хоста перед TLD (например, http://blah.bar.loc,% 3 = r).

Во-вторых, вы не можете использовать обратные ссылки в регулярном выражении RewriteCond, только в левой стороне, это своего рода странное ограничение. Однако вы можете использовать ссылки \1 в регулярном выражении, чтобы вы могли построить умную левую боковую строку для сопоставления. Что-то вроде %3::%{REQUEST_URI}, а затем вы можете так: !^(.*?)::/\1/?. Это регулярное выражение, по существу, говорит: «сопоставьте и сгруппируйте первый блок текста перед :: :: затем убедитесь, что блок текста, следующий за :: начинается с /(first block)".

Итак, ваши правила должны выглядеть так:

RewriteEngine On
RewriteCond %{HTTP_HOST} ^(www\.)?([a-zA-Z0-9-]*\.)?([a-zA-Z0-9-]+)\.loc$ [NC]
RewriteCond %3::%{REQUEST_URI} !^(.*?)::/\1/?
RewriteRule (.*) /%3/$1 [L,QSA]
39
ответ дан Jon Lin 24 August 2018 в 18:42
поделиться
Другие вопросы по тегам:

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