2009-06-29 108 views
3

我们有一个博客,我们在github上托管了Jekyll;它在那里:http://blog.superfeedr.comGitHub页面的Nginx代理?

理想情况下,我希望它在http://superfeedr.com/blog/,因为我们需要添加一些AJAX,我们需要避免“同源策略”问题。

我们使用Nginx的在我们的“主”网络服务器,我有以下设置:

location /blog/ { 

proxy_pass http://blog.superfeedr.com/; 
    proxy_redirect  off; 
    proxy_max_temp_file_size 0; 

    client_max_body_size  10m; 
    client_body_buffer_size 128k; 

    proxy_connect_timeout  90; 
    proxy_send_timeout   90; 
    proxy_read_timeout   90; 

    proxy_buffer_size   4k; 
    proxy_buffers    4 32k; 
    proxy_busy_buffers_size 64k; 
    proxy_temp_file_write_size 64k; 
} 

不幸的是,你可以看到,如果你去http://superfeedr.com/blog/这显然是行不通的。奇怪的是,我们被重定向到Github的主页。

PS:很明显,我们可以承载我们的主服务器上的博客,但我们的目标是举办一个不同的主机上,让我们几乎可以保证它是在线,如果该网站已关闭...

+0

关于PS。这个不同的主机将保持在线寂寞,这意味着只能以blog.superfeedr.com的形式提供。当主服务器关闭时,superfeedr.com/blog/将不起作用。希望你明白这一点。 – rzab 2009-06-29 15:52:58

+0

嗯,只有在Nginx关闭的情况下,如果应用程序关闭了,那就是我们想要的。 – 2009-06-29 21:03:54

回答

5

首先,nginx不会将Host头部发送到blog.superfeedr.com。这使得它发送所有需要的标题:

 
proxy_set_header Host     blog.superfeedr.com; 
proxy_set_header X-Host     blog.superfeedr.com; 
proxy_set_header X-Real-IP    $remote_addr; 
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; 

二,一些URL重写需要。由于一些奇怪的原因,这取决于您使用的nginx版本。总之,对于 0.6.x(0.6.32对我来说)这应该工作:

 
    location /blog { 
       rewrite ^/blog(.*)$ /$1 last; 
       error_page 402 = @blog; 
       return 402; 
    } 
    location @blog { 
     proxy_pass http://blog.superfeedr.com; 

     # the rest of proxying parameters should be here 

     proxy_set_header Host     blog.superfeedr.com; 
     proxy_set_header X-Host     blog.superfeedr.com; 
     proxy_set_header X-Real-IP $remote_addr; 
     proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; 
    } 

您还需要涵盖所有路径的博客是指(CSS,图像等),如

 
location /css { 
    error_page 402 = @blog; 
    return 402; 
} 

对于0.7.59:

 
     location /blog { 
       set $blog 1; 
       rewrite ^/blog(.*)$ /$1 last; 
     } 
     location /css { 
       set $blog 1; 
       error_page 402 = @blog; 
       return 402; 
     } 
     location/{ 
       if ($blog) { 
         error_page 402 = @blog; 
         return 402; 
       } 
       # here is where default settings for/should be 
       root /usr/local/www/nginx/; 
     } 
     location @blog { 
       proxy_pass http://blog.superfeedr.com; 

       # the rest of proxying parameters should be here 

       proxy_set_header Host     blog.superfeedr.com; 
       proxy_set_header X-Host     blog.superfeedr.com; 
       proxy_set_header X-Real-IP $remote_addr; 
       proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; 
     } 
0

另一种方式来做到这一点(但不涉及nginx的)可能是一个DNS指令。我认为大多数DNS服务提供URL转发服务。

例如,在hover.com,先用A指令添加到blog DNS 64.99.80.30选项卡下,然后在转发标签,转发加bloghttp://superfeedr.com/blog/

在dnsimple.com,它更简单,只需添加blogURL记录转发到http://superfeedr.com/blog/

这些转发,我相信,也适用于https://类型的URL。