有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

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错误

谢谢


共 (2) 个答案

  1. # 1 楼答案

    下面是我们最后要做的:我们去掉了第二行,并更改了java应用程序以返回错误文件的URL。任何与第一行不匹配的内容都会被最后一行捕获,并以禁止的消息进行响应。我们所要做的可能不可能用mod_重写逻辑

    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。通过这种方式,我们可以获得更好的性能,还可以完全控制响应头。给了雷吉莱罗一记重拳

  2. # 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