Apache mod_rewrite是REQUEST_URI的一部分

时间:2017-01-12 14:02:42

标签: regex apache mod-rewrite jboss

我需要一些帮助,将网址重写为小写。
所以,我有一个apache服务器,它是几个应用程序的代理(一些在IIS上,一些在JBoss上)。 JBoss应用程序有 app 上下文 问题是如果我尝试通过https://www.domain.com/App访问应用程序,我会得到404 如果我尝试https://www.domain.com/app一切都很好 如果我捕获所有RewriteRule以小写全部大写,那么我的所有链接和脚本都会得到小写但实际上并不起作用。
在这种情况下,https://www.domain.com/app/SomeFolder/SomeScript.js链接看起来像https://www.domain.com/app/somefolder/somescript.js 我想要的是,如果输入了https://www.domain.com/ ApP /SomeFolder/SomeScript.js网址,则将其更改为https://www.domain.com/ app / SomeFolder / SomeScript.js
我的Apache配置捕获大写字母和小写字母是:

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

但这不起作用,我似乎无法找到cond的正确正则表达式,只捕获应用程序上下文而不是整个REQUEST_URI,因为我的日志说不匹配。

希望这一切都有道理。如果需要更多信息,我会提供 Ty再次。

编辑:
(?< =。com /)[^ / \ s] +正则表达式捕获了我需要的东西。现在的问题是Apache将使用这个正则表达式 那么,新规则集应该如下所示(?):

RewriteMap  lc int:tolower
RewriteRule ((?<=\.com/))([^/\s]+) ${lc:$1}$2 [R=301,L]

EDIT2: 由于我没有得到更多关于此的反馈,我去尝试了其他一些方法,我最终得到了这个:

RewriteCond %{REQUEST_URI} !^/[A-Za-z]+/
RewriteCond %{REQUEST_URI} !^/[^a-z]+/
RewriteRule ^(.*)$ $1/ [R=301]
RewriteCond %{REQUEST_URI} ^/[A-Za-z]+
RewriteCond %{REQUEST_URI} ^/[^a-z]+
RewriteRule ^(.*) ${lc:$1} [R=301]
RewriteCond %{QUERY_STRING} "ReturnUrl="
RewriteRule ^(.*) $1? [R=301]

这是我想要的所有,除了小写的大写URI,当它不以大写字母开头时。因此a / APp uri将被重写为/ app但/ aPp将不会被重写。我会把它留在这里,希望我会得到一些反馈。
现在的一个问题是有时加载需要> 15秒。而且我只能将这与重写有关,在最坏的情况下,有3 301个重定向......

1 个答案:

答案 0 :(得分:1)

  

找到cond的正确正则表达式以仅捕获应用程序上下文

这个正则表达式会抓住“app /”之后的所有内容:

(?<=app/)[\S]+

现在每个完整的匹配可以简单地输入到“toLowerCase()”函数等价物。 regex demo