SSI subrequest cannot work with "error page" directive?
nightsailer
nightsailer at gmail.com
Thu May 22 15:39:03 MSD 2008
In article <nemoWed052108114412 at news.gmane.org>
nightsailer<nightsailer at gmail.com> wrote:
> Hi, I have discovered a situation where nginx can't handle
> SSIvirtualtags right with "error page":
> nginx is configured to serve local files, then fallback to
> proxyremotefile,and then stored in local through "proxy_store":
> root /cache/$host;
> location / {
> index index.shtml;
> error_page 404 = /fetch$uri;
> }
> ssi on;
> location /fetch {
> internal;
> proxy_pass <http://backend;>
> proxy_store on;
> proxy_store_access user:rw group:rw all:rw;
> proxy_set_header Host $host;
> proxy_set_header X-Real-IP $remote_addr;
> proxy_set_header Via "s9/nginx";
> alias /cache/$host;
> }
> location ~ /$ {
> index index.shtml;
> error_page 403 404 = @fetch;
> }
> location @fetch {
> internal;
> proxy_pass <http://backend;>
> proxy_store /cache/$host${uri}index.shtml;
> proxy_store_access user:rw group:rw all:rw;
> proxy_set_header Host $host;
> proxy_set_header Via "s9/nginx";
> proxy_set_header X-Real-IP $remote_addr;
> }
> example, there is index.shtml,like:
> <body>
> <!--# include virtual="/fragment/1.ssi" -->
> ...
> nginx returns the page and then attempts to process the SSI virtual
> tags. But, the virtual tags request can't redirect "/fragment/1.ssi"
> to internal location:
> "/fetch", it just report can't find "/fragment/1.ssi" .
> If I request the "/fragment/1.ssi" directly,
> it works fine, it will proxy pass to backend,and store the content
> into"/cache/host/fragment/1.ssi".
> and, if I add:
> location /fragment {
> proxy_pass <http://backend;>
> ...
> }
> now, nginx will process index.shtml and return composed content
> right.
> So,I wonder, does the subrequest to the SSI virtual tags can't
> handle"error page" directive?
>
Ok, I think error_page directive not work with SSI subrequest,
but, there's my alternate solution(more easy way):
set $index 'index.shtml';
set $store_file $request_filename;
if ($uri ~ /$ ){
set $store_file $request_filename$index;
rewrite (.*) $1index.shtml last;
}
location / {
index index.shtml;
proxy_store on;
proxy_temp_path /cache/temp;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header Via "s9/nginx";
proxy_store_access user:rw group:rw all:rw;
if ( !-e $store_file ) {
proxy_pass <http://backend;>
}
}
Now, all works fine, nginx is cool!
Sorry for my English, I'm Chinese,
for Sichuan earthquake victims:
Wish all injured people live through the baddest time.
I hope every things getting better..
--
I'm trying a new usenet client for Mac, Nemo OS X.
You can download it at http://www.malcom-mac.com/nemo
More information about the nginx
mailing list