mod_rewrite регулярное выражение, чтобы переписать части URL - PullRequest
0 голосов
/ 09 ноября 2011

Мне нужно переписать части URL-адреса в нижний регистр. Я могу переписать все символы в URL с помощью:

RewriteEngine On
RewriteMap  lc int:tolower
RewriteCond %{REQUEST_URI} [A-Z]
RewriteRule (.*) ${lc:$1} [L,R=301]

Но у меня есть особый случай. Например; http://somedomain.com/monitors/services/awe/awe-prod/awr02.awe-prod.a/Read_job_245/. Я хочу продолжать переписывать все символы в нижний регистр, кроме, например, Read_job_245 . Read_job_245 может быть любыми буквами или цифрами в верхнем или нижнем регистре и всегда будет на шестом уровне.

Я не могу понять часть mod_rewrite.

Заранее спасибо за любую помощь.

1 Ответ

0 голосов
/ 19 мая 2012

Если вы имеете в виду «Я хочу переписать любой уровень , кроме шестой», то это должно сработать:

RewriteEngine On
RewriteMap  lc int:tolower
RewriteCond %{REQUEST_URI} [A-Z]
RewriteCond %{REQUEST_URI} !^((/[^A-Z/]+){5})(/[^/]*[A-Z][^/]*)(/[^A-Z/]+)*/?$
RewriteRule ^((/[^/]+){1,5})((/[^/]+)((/[^/]+)*))? ${lc:$1}$4${lc:$5} [L,R=301]

(обратите внимание, что URL-адреса начинаются с «/», поскольку RewriteMap выиграл 'он не работает и поэтому, похоже, не работает в .htaccess для меня)

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

Если вы когда-нибудь попадете только на 6 уровней (а шестой никогда не следует переписывать), тогда этого должно быть достаточно:

RewriteEngine On RewriteMap lc int: tolower RewriteCond% {REQUEST_URI} [AZ] RewriteCond% {REQUEST_URI}! ^ ((/ [^ AZ /] +) {5}) (/ [^ /] [AZ] [^/] ) /? $ RewriteRule ^ ((/ [^ /] +) {1,5}) (/ [^ /] +) /?$ {lc: $ 1} $ 4 [L, R = 301]

Протестировано с:

/monitors/services/awe/AWE --> /monitors/services/awe/awe
/monitors/services/awe/awe-prod/awr02.awe-prod.a/Read_job_245/ --> No change
/MONITORS/SERVICES/awe/awe-prod/awr02.awe-prod.a/Read_job_245/ --> /monitors/services/awe/awe-prod/awr02.awe-prod.a/Read_job_245/
/MONITORS/SERVICES/awe/awe-prod/awr02.awe-prod.a/Read_job_245/AAA/BBB/ --> /monitors/services/awe/awe-prod/awr02.awe-prod.a/Read_job_245/aaa/bbb/ (using 1st rule set)

Построчное объяснение:

#Enable mod_rewrite
RewriteEngine On
#Create mapping to lower case
RewriteMap  lc int:tolower
#Match URLs with upper-case characters
RewriteCond %{REQUEST_URI} [A-Z]
#Stop rewrite loop when upper-case is in the allowed 6th level
RewriteCond %{REQUEST_URI} !^((/[^A-Z/]+){5})(/[^/]*[A-Z][^/]*)/?$
#Rewrite URL to lower case
RewriteRule ^((/[^/]+){1,5})(/[^/]+)/? ${lc:$1}$4 [L,R=301]
...