java mod_重写规则(如果出现其他问题)
我的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”,我们希望重写规则将其更改为错误页面。所以规则1和规则2是联系在一起的。如果规则1运行,则需要运行规则2。如果规则1和规则2匹配,则规则3不应运行。规则3是返回403禁止的错误的全面捕获规则
上面的代码很接近,但不完全相同。“一网打尽”的最终规则是抓得太多。如果规则1匹配,那么规则3也将捕获它并返回403
我们如何编写这样的代码,使规则1和2如上所述工作,但如果它们不匹配,将返回403错误
谢谢
# 1 楼答案
下面是我们最后要做的:我们去掉了第二行,并更改了java应用程序以返回错误文件的URL。任何与第一行不匹配的内容都会被最后一行捕获,并以禁止的消息进行响应。我们所要做的可能不可能用mod_重写逻辑
然后,我们决定让一个Java应用程序回答重写问题的瓶颈太多,并将其转换为在Tomcat下运行的servlet。通过这种方式,我们可以获得更好的性能,还可以完全控制响应头。给了雷吉莱罗一记重拳
# 2 楼答案
使用[L]标志,此标志表示在匹配时停止重写过程。因此,为第一个和第二个标记添加此标记
编辑
太快了;:您还需要将[C]标记添加到第一条规则中,以便它与第二条规则链接,这样,如果第一条规则匹配,则第二条规则将运行。只有第二个需要[L]
结束编辑
关于rewriteMap prg,apache文档要求在不匹配的情况下返回“NULL”,而不是“error”
如果您仍然对mod rewrite有一些疑问,并且对apache mod rewrite文档感到害怕,那么请查看这个关于servfault的优秀文档:everything-you-ever-wanted-to-know-about-mod-rewrite-rules-but-were-afraid-to-ask