我的Apache配置使用mod_rewrite来调用外部应用程序(使用RewriteMap prg)来重写URL。这很好。我需要处理的是边界条件,其中请求URL与我们正在寻找的URL没有特别匹配。此外,外部应用程序返回错误,我们需要重定向到错误页面。
以下是代码:
RewriteMap forwardURL "prg:\"C:/Program Files/Java/jdk1.6.0_11/bin/java.exe\" -jar \"C:/app/Mapper.jar\""
RewriteLock bin\map.sub.lock
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^/SomeScript.asp(.*)$ ${forwardURL:%{QUERY_STRING}}
RewriteRule ^/error(.*)$ /error.html [L]
RewriteRule ^(.*)$ - [F]
当我们收到旧的ASP脚本(SomeScript.asp)的请求时,将调用Java应用程序来查找正确的URL。它将返回正确的URL或“/ error”。如果返回“/ error”,我们希望RewriteRule将其更改为错误页面。因此,规则1和2捆绑在一起。如果规则1运行,则需要运行规则2。如果规则1和规则2匹配,则规则3不应运行。规则3是捕获所有返回403-禁止错误的规则。
上面的代码很接近,但并不完全存在。总而言之的最终规则是抓得太多了。如果规则1匹配,则规则3也将捕获它并返回403。
我们如何写这个,所以规则1和2如上所述,但是如果它们不匹配则返回403错误?
由于
答案 0 :(得分:1)
使用 [L] 标志,此标志表示如果匹配则停止重写过程。因此,为 1st和第二个标记添加此标记。
修改强> -
太快了;:您需要将 [C] 标记添加到第一个规则,以便它与第二个规则链接,这使得第二个规则在第一个匹配时运行。只有第二个需要[L]
结束修改 -
关于rewriteMap prg apache文档要求在没有匹配的情况下返回'NULL',而不是'错误'。
如果你有一些关于mod-rewrite的问题,并且害怕apache mod-rewrite文档,请在servfault上检查这个优秀的问题:everything-you-ever-wanted-to-know-about-mod-rewrite-rules-but-were-afraid-to-ask
答案 1 :(得分:1)
以下是我们最终做的事情:我们摆脱了第二行,并更改了Java应用程序以返回错误文件的URL。任何与第一行不匹配的内容都会被最终的catch-all行捕获,并以Forbidden消息响应。使用mod_rewrite逻辑可能无法实现我们想要做的事情。
RewriteMap forwardURL "prg:\"C:/Program Files/Java/jdk1.6.0_11/bin/java.exe\" -jar \"C:/app/Mapper.jar\""
RewriteLock bin\map.sub.lock
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^/SomeScript.asp(.*)$ ${forwardURL:%{QUERY_STRING}} [L]
RewriteRule ^(.*)$ - [F]
然后我们决定让单个Java应用程序回答重写问题的瓶颈太多,并将其转换为在Tomcat下运行的servlet。我们通过这种方式获得了更好的性能,也可以完全控制响应头。给了regilero一个尝试的冲击。