mod_rewrite正则表达式重写网址的一部分

时间:2011-11-08 22:01:41

标签: regex url mod-rewrite apache2

我需要将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 :(得分:0)

如果你的意思是“我想重写任何级别,除了第六级”,那么这应该有效:

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} [A-Z]     RewriteCond%{REQUEST_URI}!^(([[A-Z /] +){5})(/ [^ /] [A-Z] [^ /] )/?$     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]
相关问题