Apache 重写导致两个请求

Apache rewrite causes two requests

我注意到,当我们请求静态资源时,即像这样: 获取 /MYAPP/css/navbar.css

它在 Apache 日志中显示为两行:

[20/Jul/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

这与配置中设置的当前重写规则有关:

RewriteRule ^/MYAPP/css/(.*)$ https://%{SERVER_NAME}/css/
...
<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)。 这里有什么最好的典型解决方案?

如果您的 %{SERVER_NAME} 符合规则

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

与主机名不同,那么 Apache 将进行外部重定向,并写入日志行,并且将提供一个新请求。可能会发生很多事情,具体取决于您的设置,但我猜现在您应该尝试这样的规则:

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

关于 RewriteRule 的 Apache 文档中描述了我认为可能是问题的地方,他们描述了 "Substitution" 段落 "Absolute URL".

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