Apache-2.4

讓 Apache 提供靜態內容而不是將其轉發給 Plone (++resource++)

  • July 13, 2015

我有一個基於 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 虛擬主機機器負責“反向”部分本身)。

謝謝你的幫助!

我找到了讓它工作的方法。

增加日誌級別後:

LogLevel alert rewrite:trace5

…我得到了一些關於模式匹配的額外資訊(在第 4 級)。

當放在方括號中時,文字+字元起作用:

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

對於別名,這不是必需的:

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

引用自:https://serverfault.com/questions/704932