Cách đặt robot.txt trên toàn cầu trong nginx cho tất cả các máy chủ ảo


13

Tôi đang cố gắng thiết lập robots.txtcho tất cả các máy chủ ảo trong máy chủ nginx http. Tôi đã có thể làm điều đó trong Apache bằng cách đưa vào phần sau httpd.conf:

<Location "/robots.txt">
    SetHandler None
</Location>
Alias /robots.txt /var/www/html/robots.txt

Tôi đã thử làm một cái gì đó tương tự với nginx bằng cách thêm các dòng được đưa ra dưới đây (a) trong nginx.conf và (b) như bao gồm conf.d / robot.conf

location ^~ /robots.txt {
        alias /var/www/html/robots.txt;
}

Tôi đã thử với '=' và thậm chí đặt nó vào một trong những máy chủ ảo để kiểm tra nó. Dường như không có gì để làm việc

Tôi đang thiếu gì ở đây? Có cách nào khác để đạt được điều này?


Lưu ý: Không có cách nào để đặt nó làm cài đặt Toàn cầu (nghĩa là được đặt trong một tệp áp dụng cho tất cả các máy chủ ảo mà không có câu lệnh bao gồm). Người ta có thể đặt robot.conf trong conf.d (hoặc global.d [không chuẩn]) và bao gồm điều đó trong mọi cấu hình máy chủ ảo. Tất cả các câu trả lời khác chỉ ra nhiều cách khác nhau để thực hiện cùng một điều viz: proxy_pass, lấy lại {}, v.v.
anup

Câu trả lời:


4

vị trí không thể được sử dụng bên trong httpkhối. nginx không có bí danh toàn cầu (nghĩa là bí danh có thể được xác định cho tất cả các vhost). Lưu các khiếm khuyết toàn cầu của bạn trong một thư mục và bao gồm những người.

server {
  listen 80;
  root /var/www/html;
  include /etc/nginx/global.d/*.conf;
}

Như được đưa ra trong câu hỏi tôi đã cố gắng làm như vậy bằng cách đặt robot.conf vào thư mục conf.d. Nhưng nó không hoạt động như toàn cầu.
anup

tiếp theo ... Như bạn đã nói, Nginx không có bí danh toàn cầu. Cuối cùng, độ phân giải là thêm nó vào mỗi cấu hình máy chủ ảo.
anup

43

Bạn có thể đặt trực tiếp nội dung của tệp robots.txt trong cấu hình nginx:

    location = /robots.txt { return 200 "User-agent: *\nDisallow: /\n"; }

Cũng có thể thêm Kiểu nội dung chính xác:

    location = /robots.txt {
       add_header Content-Type text/plain;
       return 200 "User-agent: *\nDisallow: /\n";
    }

1
Chỉ cần một lưu ý: Tôi cần đặt location = /robots.txt(Lưu ý dấu bằng) nếu không, một location ~* \.(txt|log)$trận đấu khác bên dưới nó sẽ ghi đè lên nó.
Beebee

Làm thế nào điều này có thể được thêm vào một gọn gàng conf.d/robots.conf? Như chỉ thị "địa điểm" không được phép ở đây , điều này hợp lý, nhưng nó không dành cho một máy chủ cụ thể. Tôi không chắc chắn về @ user79644 trả lời cho điều này. Là không thể tránh khỏi để thêm điều này vào mỗi trang web?
Pablo A

Tôi đã không kiểm tra điều này. Nhưng, trông tương tự như câu hỏi, ngoại trừ việc 'trả lại' được sử dụng thay cho bí danh. Vấn đề tôi phải đối mặt là làm cho nó trở thành một thiết lập toàn cầu. Điều đó có nghĩa là tôi không nên lặp lại nó trong mỗi .cs của một trang web. Tôi không thể có được phương thức toàn cầu để làm việc theo cách nó hoạt động với Apache. Ví dụ, một máy chủ Phát triển không nên được thu thập thông tin.
anup

10

Có quy tắc khác được xác định? Có thể là common.conf hoặc một tệp conf khác được bao gồm trong quá trình cấu hình của bạn. Một trong những điều sau đây chắc chắn nên làm việc.

location /robots.txt { alias /home/www/html/robots.txt; }
location /robots.txt { root /home/www/html/;  }
  1. Nginx chạy tất cả các vị trí "regrec" theo thứ tự xuất hiện của chúng. Nếu bất kỳ vị trí "regrec" nào thành công, Nginx sẽ sử dụng trận đấu đầu tiên này. Nếu không có vị trí "regrec" nào thành công, Nginx sử dụng vị trí thông thường được tìm thấy ở bước trước.
  2. Các vị trí "regrec" được ưu tiên hơn các vị trí "tiền tố"

Nó không hoạt động như một lựa chọn toàn cầu. Nhưng, hoạt động trong cấu hình của virtualhost. Tôi đã sử dụng cái đầu tiên (location /robots.txt) và thậm chí cái tôi đã chỉ định trong câu hỏi ('~ * /robots.txt'). Cả hai đều hoạt động với cấu hình của Virtual Host. Tôi nghĩ rằng việc sử dụng 'location' 'nếu {}' nằm trong chỉ thị của 'máy chủ' và điều này, có lẽ không hoạt động ở cấp độ toàn cầu.
anup

Hãy chắc chắn rằng bạn có một /robots.txttập tin để bí danh. Tôi đã không có roottùy chọn để làm việc.
Shadoath

-1

Tôi đã có cùng một vấn đề với các challanges acme, nhưng nguyên tắc tương tự cũng áp dụng cho trường hợp của bạn.

Những gì tôi đã làm để giải quyết vấn đề này là chuyển tất cả các trang web của tôi sang một cổng không chuẩn, tôi đã chọn 8081và tạo một máy chủ ảo lắng nghe trên cổng 80. Nó ủy quyền tất cả các yêu cầu 127.0.0.1:8081, ngoại trừ các yêu cầu đến .well được biết đến. Điều này hoạt động gần như một bí danh toàn cầu, có thêm một bước nhảy, nhưng điều đó không gây ra sự sụt giảm đáng kể về hiệu suất do tính chất không đồng bộ của nginx.

upstream nonacme {
  server 127.0.0.1:8081;
}

server {
  listen 80;

  access_log  /var/log/nginx/acme-access.log;
  error_log   /var/log/nginx/acme-error.log;

  location /.well-known {
    root /var/www/acme;
  }

  location / {
    proxy_set_header    Host                $http_host;
    proxy_set_header    X-Real-IP           $remote_addr;
    proxy_set_header    X-Forwarded-For     $proxy_add_x_forwarded_for;
    proxy_set_header    X-Forwarded-Proto   $scheme;
    proxy_set_header    X-Frame-Options     SAMEORIGIN;

    # WebSocket support (nginx 1.4)
    proxy_http_version 1.1;
    proxy_set_header Upgrade $http_upgrade;
    proxy_set_header Connection "upgrade";

    proxy_pass http://nonacme;
  }
}
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.