Pregunta

Tenemos un blog que alojamos en github con Jekyll; está allí: http://blog.superfeedr.com

Idealmente, quiero que esté en http://superfeedr.com/blog/ porque necesitamos agregar algo de AJAX y debemos evitar la " misma política de origen " problemas.

Usamos Nginx en nuestra " main " servidor web, y tengo la siguiente configuración:

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;
}

Desafortunadamente, como puede ver si va a http://superfeedr.com/blog/ esto obviamente no funciona. Por extraño que parezca, se nos redirige a la página de inicio de Github.

PD: obviamente, podríamos alojar el blog en nuestro servidor principal, pero el objetivo es alojarlo en un host diferente para que casi podamos garantizar que esté en línea si el sitio está caído ...

¿Fue útil?

Solución

Primero, nginx no envía el encabezado del Host al blog.superfeedr.com. Esto hace que envíe todos los encabezados necesarios:

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;

Segundo, se requiere una reescritura de URL. Por alguna extraña razón, esto depende de la versión de nginx que esté utilizando. De todas formas, para 0.6.x (0.6.32 para mí) esto debería funcionar:

    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;
    }

También debe cubrir todas las rutas a las que se refiere el blog (CSS, imágenes, etc.), por ejemplo,

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

Para 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;
        }

Otros consejos

Otra forma de hacerlo (pero sin involucrar a nginx) podría ser con una directiva DNS. Creo que la mayoría de los servicios de DNS ofrecen servicio de reenvío de URL.

Por ejemplo, en hover.com, primero agregue blog con la directiva A a 64.99.80.30 en la pestaña DNS, y luego en la pestaña Reenviar, agregue http://superfeedr.com/blog/ reenviar a URL

En dnsimple.com, es más simple, solo agregue https:// <=> registro para reenviar a <=>

Estos reenvíos, creo, también funcionan para <=> URL de tipo.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top