Назад | Перейти на главную страницу

Nginx перенаправить запрос на URL

Я пытаюсь перенаправить HTTP-запрос на сервер, указанный в URL-адресе запроса, но в результате всегда получаю 404. Это мой конфиг:

worker_processes 2;
daemon off;

error_log  /var/log/nginx.error_log  info;

events {
    worker_connections   1000;
    # use [ kqueue | epoll | /dev/poll | select | poll ];
    use epoll;
}

http {
  include       mime.types;
  default_type  application/octet-stream;

  log_format main      '$remote_addr - $remote_user [$time_local] '
                        '"$request" $status $bytes_sent '
                        '"$http_referer" "$http_user_agent" '
                        '"$gzip_ratio"';

  log_format download  '$remote_addr - $remote_user [$time_local] '
                        '"$request" $status $bytes_sent '
                        '"$http_referer" "$http_user_agent" '
                        '"$http_range" "$sent_http_content_range"';

  client_header_timeout  3m;
  client_body_timeout    3m;
  send_timeout           3m;

  client_header_buffer_size    1k;
  large_client_header_buffers  4 4k;

  gzip on;
  gzip_min_length  1100;
  gzip_buffers     4 8k;
  gzip_types       text/plain;

  output_buffers   1 32k;
  postpone_output  1460;

  sendfile         on;
  tcp_nopush       on;
  tcp_nodelay      on;
  send_lowat       12000;

  keepalive_timeout  75 20;

  #lingering_time     30;
  #lingering_timeout  10;
  #reset_timedout_connection  on;

  server {
      listen       80;
      #server_name   one.example.com  www.one.example.com;

      access_log   /var/log/nginx.access_log  main;

      location /proxy {
          rewrite ^\/proxy\/(.*) $1 break;
          resolver 8.8.8.8;
          proxy_pass         http://$1/index.html;
          proxy_redirect      off;

          proxy_set_header   Host             $host;
          proxy_set_header   X-Real-IP        $remote_addr;
          #proxy_set_header  X-Forwarded-For  $proxy_add_x_forwarded_for;

          client_max_body_size       10m;
          client_body_buffer_size    128k;

          #client_body_temp_path      /var/nginx/client_body_temp;

          proxy_connect_timeout      70;
          proxy_send_timeout         90;
          proxy_read_timeout         90;
          proxy_send_lowat           12000;

          #proxy_buffering off;
          proxy_buffer_size          4k;
          proxy_buffers              4 32k;
          proxy_busy_buffers_size    64k;
          proxy_temp_file_write_size 64k;

          #proxy_temp_path            /var/nginx/proxy_temp;
          charset  koi8-r;
      }
  }
}

Например http: //localhost/proxy/www.google.com возвращает 404, url / не найден.

Лучший подход к вашему прокси-серверу будет выглядеть так:

location ~ /proxy/(.+)$ {
    proxy_pass http://$1/index.html;
}

Однако такой подход даст вам только /index.html для любого веб-сайта, который вы указываете в URL-адресе.

При таком подходе вам не понадобится rewrite заявление.

Это не совсем то, как обратный прокси с участием proxy_pass предполагается использовать, но предположим, что

location /proxy {
    rewrite ^\/proxy\/(.*) $1 break;
    resolver 8.8.8.8;
    proxy_pass         http://$1/index.html;
    proxy_redirect      off;

работает, и запрос передается на $1 то есть сервер в www.google.com, запрашивая /index.html. Однако, поскольку у вас есть

proxy_set_header   Host   $host;

оригинал Host: localhost запрашивается от www.google.com:

GET /index.html HTTP/1.1
Host: localhost

Поскольку вам нужно запросить

GET /index.html HTTP/1.1
Host: www.google.com

вместо этого вам лучше иметь

proxy_set_header   Host   $1;

Тем не менее, в настоящее время я не могу протестировать эту общую конфигурацию; Я только что заметил эту единственную ошибку.