Перенаправить запрос 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 / не найден.

0
задан 8 July 2017 в 13:56
2 ответа

Это не совсем то, как предполагается использовать обратный прокси с 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;

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

0
ответ дан 5 December 2019 в 07:50

Более подходящий подход к местоположению вашего прокси-сервера будет выглядеть так:

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

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

При таком подходе вам не нужен оператор rewrite .

0
ответ дан 5 December 2019 в 07:50

Теги

Похожие вопросы