Встроенный перл в ssi

Igor Sysoev is at rambler-co.ru
Mon Jun 22 17:55:54 MSD 2009


On Mon, Jun 22, 2009 at 03:45:47PM +0300, Vladimir Aliokhin wrote:

> Приветствую.
> 
> Возникла проблема, Помогите пожалуйста выяснить где ошибка.
> Проблема в том что если использовать вызовы встроенного перла в ssi то
> все что после этого вызова nginx ничего браузеру не отдает.
> 
> Исходные данные:
> ubuntu 9.04, nginx 0.7.61, собирается обычно: ./configure
> --with-http_perl_module && make install
> 
> конфиг nginx:
> 
> worker_processes  1;
> 
> events {
>     worker_connections  1024;
> }
> 
> http {
>     include       mime.types;
>     default_type  application/octet-stream;
>     sendfile        on;
>     keepalive_timeout  65;
>     perl_modules conf/perl;
>     perl_require test.pl;
>     server {
>         listen       80;
>         server_name  localhost;
>         ssi on;
>         location / {
>             root   html;
>             index  index.shtml;
>             location /perl {
>                perl test::test;
>             }
>         }
>     }
> }
> 
> Файл conf/perl/test.pl:
> 
> package test;
> use nginx;
> sub test {
>    my $r = shift;
>    $r->send_http_header("text/html");
>    return OK if $r->header_only;
>    $r->print("Test from perl\n");
>    $r->flush();
>    return OK;
> }
> 
> файл html/index.shtml:
> 
> Hello
> <hr/>
> Perl : <!--#include virtual="/perl" -->
> <hr/>
> Included : <!--#include virtual="/included.html" -->
> <hr/>
> 
> Файл html/included.html:
> Included file
> 
> если теперь открыть http://127.0.0.1 в браузере то получим:
> 
> Hello
> ------------------------------------
> Perl : Test from perl
> 
> или, если посмотрим исходник страницы:
> 
> Hello
> <hr/>
> Perl : Test from perl
> 
> 
> и все, хотя должно быть еще
> ----------------------------------
> Included : Included file
> 
> 
> Хотя если скачать файл index.shtml обычным wget-ом то получим
> 
> Hello
> <hr/>
> Perl : Test from perl
> 
> <hr/>
> Included : Included file
> 
> 
> <hr/>
> 
> То есть то что надо. Однако браузер не хочет отображать ничего после
> инклуда перла.
> проверено на firefox 3.5/linux, Opera 10/linux, elinks 0.12pre2/linux.
> Та же ситуация и на firefox, IE на винде.

Прилагаемый патч должен помочь.


-- 
Игорь Сысоев
http://sysoev.ru
-------------- next part --------------
Index: src/http/ngx_http_request.c
===================================================================
--- src/http/ngx_http_request.c	(revision 2279)
+++ src/http/ngx_http_request.c	(working copy)
@@ -2694,7 +2694,13 @@
     }
 
     if (flags & NGX_HTTP_LAST) {
-        b->last_buf = 1;
+
+        if (r == r->main && !r->post_action) {
+            b->last_buf = 1;
+
+        } else {
+            b->last_in_chain = 1;
+        }
     }
 
     if (flags & NGX_HTTP_FLUSH) {
Index: src/http/ngx_http_upstream.c
===================================================================
--- src/http/ngx_http_upstream.c	(revision 2279)
+++ src/http/ngx_http_upstream.c	(working copy)
@@ -2888,7 +2888,7 @@
 
     r->connection->log->action = "sending to client";
 
-    if (rc == 0 && r == r->main && !r->post_action) {
+    if (rc == 0) {
         rc = ngx_http_send_special(r, NGX_HTTP_LAST);
     }
 


More information about the nginx-ru mailing list