2015-07-20 67 views
0

我注意到,当我们请求一个静态资源,即是这样的: GET /MYAPP/css/navbar.css阿帕奇重写导致两个请求

它出现在Apache日志为两条线:

[20 /月/ 2015:11:39:07 -0400] 10.72.123.1的TLSv1 AES256-SHA “GET /MYAPP/css/navbar.css HTTP/1.1” 302 224 0/159

[20/Jul/2015:11:39:07 -0400] 10.72.123.1 TLSv1 AES256-SHA“GET /css/navbar.css HTTP/1.1”200 2846 0/364

这是事做在configs设立了当前重写规则:

RewriteRule ^/MYAPP/css/(.*)$ https://%{SERVER_NAME}/css/$1 
... 
<Directory "/var/www/myapp-static"> 
    Options None 
    AllowOverride None 
    Order allow,deny 
    Allow from all 
</Directory> 

我是不是正确的,什么东西是错在这里?每个对静态文件的请求都会导致两个调用,而不是一个,它会以任何方式减少apache的整体性能?处理这个问题的最佳做法是什么? 作为解决方案之一,我们可以直接使用静态资源链接作为/css/navbar.css,而不是通过/MYAPP/css/navbar.css。但是如果它运行时没有使用apache,这会使应用程序失败(因为我们确实有一些环境中没有apache)。 什么是最好的和典型的解决方案在这里?

+0

%{SERVER_NAME}的值是否与主机名不同? – Zimmi

+0

@Zimmi我不知道说实话..我如何检查SERVER_NAME的值?它是否与中定义的属性ServerName有关? – javagirl

+0

@Zimmi其实一定是! VirtualHost中的ServerName被定义为负载平衡的域名,而主机可以不同。所以他们应该是相同的? – javagirl

回答

1

如果您%{SERVER_NAME}内部规则

RewriteRule ^/MYAPP/css/(.*)$ https://%{SERVER_NAME}/css/$1 

的是从主机名不同,那么Apache将会外部重定向,并写入日志线,和一个新的请求到来时,将送达。很多事情可能发生,取决于你的设置,但现在我的猜测是,你应该给一个尝试这样一个规则:

RewriteRule ^/MYAPP/css/(.*)$ /css/$1 

我觉得可能是什么问题是在Apache DOC约RewriteRule描述,他们在那里描述“替代”,段落“绝对URL”。

如果您还需要https的规则,则可以使用环境变量%{HTTP_HOST}而不是%{SERVER_NAME}

+0

非常感谢,会给它一个去 – javagirl

+0

谢谢你,有像你建议的规则修复日志文件中的两个条目。不过,感觉这个设置还不够完美。当我访问如下文件时:https:// /MYAPP/css/navbar.css它的平均时间比https:// /css/navbar.css多两倍 - 为什么?请注意,我也有一个mod_jk模块,它有这个挂载点:JKMount/MYAPP/* MYAPP – javagirl

+0

@javagirl很高兴知道它解决了2线问题。我相当确信你提到的性能影响不是来自这种重写。尤其是当你看起来你已经在http conf文件中,所以这个(简单的)正则表达式在服务器启动时编译一次(这当然不是htaccess的情况)。我没有mod_jk的知识,我无法在这方面进一步帮助你。可能是另一个问题,现在这个重定向被清除了吗? – Zimmi