Proxy Nginx para una página de GitHub?
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 ...
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.