apache 将 ProxyPass 用于页面而不是图像
声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow
原文地址: http://stackoverflow.com/questions/569861/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me):
StackOverFlow
Using ProxyPass for pages but not images
提问by Marcus Downing
As a result of horrible, horrible errors, we've changed how we connect Apache to Tomcat. We were using mod_jk:
由于可怕的、可怕的错误,我们改变了将 Apache 连接到 Tomcat 的方式。我们正在使用mod_jk:
JkMount /path ajp13
Now we're using mod_proxy_ajp:
现在我们使用mod_proxy_ajp:
ProxyPass /path ajp://localhost:8009/path
ProxyPassReverse /path ajp://localhost:8009/path
However, there's a feature that JkMountoffered but ProxyPassdoesn't: the ability to select on file types. This made it possible to proxy html files, but not images - in other words, to let the nice fast Apache serve the static stuff, and resorting to the slow Tomcat only for the dynamic stuff.
但是,有一个JkMount提供但ProxyPass没有提供的功能:选择文件类型的能力。这使得代理 html 文件而不是图像成为可能——换句话说,让漂亮的快速 Apache 为静态内容提供服务,而只为动态内容使用慢速 Tomcat。
JkMount /*.html ajp13
Is there any way of achieving this with ProxyPass? Possibly using a surrounding <Location>directive or something like that?
有什么方法可以实现这一点ProxyPass吗?可能使用周围<Location>指令或类似的东西?
回答by kmkaplan
Use ProxyPassMatch:
ProxyPassMatch ^/(path/.*\.html)$ ajp://localhost:8009/
Edited: Marcus Downing's correction
编辑:马库斯唐宁的更正
回答by jason saldo
Not your issue but something to watch out for using this configuration. While using apache mod_proxy to connect to tomcat my error log was showing dropped connections under moderate load. Adding this to httpd.conf solved my problems.
不是您的问题,而是使用此配置时需要注意的事项。在使用 apache mod_proxy 连接到 tomcat 时,我的错误日志显示在中等负载下连接断开。将此添加到 httpd.conf 解决了我的问题。
SetEnv force-proxy-request-1.0 1
SetEnv proxy-nokeepalive 1
回答by Marcus Downing
kmkaplan's post is the right answer, but it gave me the error:
kmkaplan 的帖子是正确的答案,但它给了我错误:
Syntax error on line 32 of .../httpd-vhosts.conf:
ProxyPass Unable to parse URL
It worked when I changed the directive to read:
当我将指令更改为读取时,它起作用了:
ProxyPathMatch ^/(path/.*\.html)$ ajp://localhost:8009/
I can only assume that putting the $1right next to the port number 8009was confusing it.
我只能假设将$1右侧放在端口号旁边会让人8009感到困惑。
回答by Hyman
We use the following to let Apache serve images and set reasonable expires headers:
我们使用以下内容让 Apache 提供图像并设置合理的过期标头:
<Virtualhost *:80>
ServerName domain.com
ServerAlias *.domain.com
Alias /img/ /var/www/domain/img/
<Directory /var/www/domain/img/>
ExpiresActive On
ExpiresByType image/gif "access plus 1 months"
ExpiresByType image/jpg "access plus 1 months"
ExpiresByType image/jpeg "access plus 1 months"
ExpiresByType image/png "access plus 1 months"
ExpiresByType image/x-icon "access plus 1 months"
ExpiresByType image/ico "access plus 1 months"
# This will prevent apache from having to check for a .htaccess file on each request.
AllowOverride None
# Allow symlinks. Otherwise, apache will make a separate call on each filename to ensure it is not a symlink.
Options +FollowSymLinks -SymLinksIfOwnerMatch
Order allow,deny
Allow from all
</Directory>
ProxyRequests Off
<Proxy *>
Order deny,allow
Allow from all
</Proxy>
# Prevent domain.com/img from being served by Tomcat
ProxyPass /img !
# Pass all other requests to Tomcat
ProxyPass / ajp://localhost:8009/
# 1. Note that usually no ProxyPassReverse directive is necessary. The AJP request includes
# the original host header given to the proxy, and the application server can be expected to
# generate self-referential headers relative to this host, so no rewriting is necessary.
# 2. If you still want to use it, read this first:
# http://www.humboldt.co.uk/2009/02/the-mystery-of-proxypassreverse.html
# ProxyPassReverse / http://domain.com/
</Virtualhost>
However, as you can see, we store images outside of our Tomcat application. I don't know if it also works for images inside the application.
但是,如您所见,我们将图像存储在 Tomcat 应用程序之外。我不知道它是否也适用于应用程序内的图像。

