让 Apache 提供静态内容而不是将其转发到 Plone (++resource++)

让 Apache 提供静态内容而不是将其转发到 Plone (++resource++)

我有一个基于 Plone 的网站,运行在 Apache 2.4 上,它的性能可能会更好一些。一个想法是让 Apache 提供内容的静态部分,防止它们被 Plone 进程重写,这是常见的做法:

RewriteEngine On
RewriteRule  ^/(.*) http://localhost:8080/VirtualHostBase/http/%{HTTP_HOST}:80/Plone/VirtualHostRoot/$1 [L,P

这些静态内容并不全都在同一个地方。但是,Plone 提供了一种命名资源目录的标准方法;例如,mybrowser的“浏览器”myproduct可以有一个文件系统目录static

/my/plone/root/Products/myproduct/mybrowser/static/

将被发布为/++resource++mybrowser-static

让 Plone 提供静态文件没有多大意义,所以我想防止某些请求被重写而是直接提供。

这是我尝试过的:

# in Plone: /++resource++mybrowser-static
<Directory /my/plone/root/Products/myproduct/mybrowser/static>
    Options All
    AllowOverride All
    Require all granted
</Directory>
Alias /static                       /my/plone/root/Products/myproduct/mybrowser/static
Alias /++resource++mybrowser-static /my/plone/root/Products/myproduct/mybrowser/static
LogLevel alert rewrite:trace3 alias:trace3
...
RewriteCond %{REQUEST_URI} !^/++resource++mybrowser-static
RewriteCond %{REQUEST_URI} !^/static/
RewriteRule ^/(.*) http://localhost:8080/VirtualHostBase/http/%{HTTP_HOST}:80/Plone/VirtualHostRoot/$1 [L,P]

因此,我目前对同一个目录有两个别名;++版本是更通用的方法,所以我希望它能够起作用。

但是,当我请求时http://my.site.com/static/logo.png,它有效:

... [rewrite:trace2] ... init rewrite engine with requested uri /static/logo.png
... [rewrite:trace3] ... applying pattern '^/(.*)' to uri '/static/logo.png'
... [rewrite:trace1] ... pass through /static/logo.png

... 而.../++resource++mybrowser-static/版本没有(即由 Zope 提供服务):

... [rewrite:trace2] ... init rewrite engine with requested uri /++resource++mybrowser-static/logo.png
... [rewrite:trace3] ... applying pattern '^/myunitracc([/?].+)\\?$' to uri '/++resource++mybrowser-static/logo.png'
... [rewrite:trace3] ... applying pattern '^/(.*)' to uri '/++resource++mybrowser-static/logo.png'
... [rewrite:trace2] ... rewrite '/++resource++mybrowser-static/logo.png' -> 'http://localhost:8080/VirtualHostBase/http/my.site.com:80/Plone/VirtualHostRoot/++resource++mybrowser-static/logo.png'
... [rewrite:trace2] ... forcing proxy-throughput with http://localhost:8080/VirtualHostBase/http/my.site.com:80/Plone/VirtualHostRoot/++resource++mybrowser-static/logo.png
... [rewrite:trace1] ... go-ahead with proxy request proxy:http://localhost:8080/VirtualHostBase/http/my.site.com:80/Plone/VirtualHostRoot/++resource++mybrowser-static/logo.png [OK]

我希望通过代替强制代理吞吐量在两种情况下。

我是否需要以+某种方式引用这些字符?我已经尝试在它们前面加上反斜杠,或者用 替换它们%2B,但似乎没有什么区别。

我看了这里也一样,但是ProxyPass <url> !对我来说不起作用(还没有?),可能是因为 RewriteRule 而不是ProxyPass/ ProxypassReverse(Zope 虚拟主机机制本身负责“反向”部分)。

谢谢你的帮助!

答案1

我找到了让它发挥作用的方法。

增加日志级别后:

LogLevel alert rewrite:trace5

...我获得了一些关于模式匹配的附加信息(在第 4 级)。

当放在方括号中时,文字+字符的作用如下:

RewriteCond !^/[+][+]resource[+][+]myproduct-static/
RewriteRule ...    

对于别名,这不是必需的:

Alias /++resource++myproduct-static /my/zope/root/Products/myproduct/static

相关内容