모든 가상 호스트에 대해 nginx에서 robots.txt를 전역으로 설정하는 방법


13

robots.txtnginx http 서버 아래의 모든 가상 호스트 를 설정하려고 합니다. 나는 다음을 main에 두어 Apache에서 할 수있었습니다 httpd.conf.

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

아래의 (a) nginx.conf 및 (b) conf.d / robots.conf를 포함하여 nginx와 비슷한 작업을 시도했습니다.

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

나는 '='로 시도했고 심지어 그것을 테스트하기 위해 가상 호스트 중 하나에 넣었습니다. 아무것도 효과가없는 것 같습니다.

내가 여기서 무엇을 놓치고 있습니까? 이것을 달성하는 다른 방법이 있습니까?


참고 : 전역 설정 (예 : include 문없이 모든 가상 호스트에 적용되는 하나의 파일에 설정)으로 설정하는 방법은 없었습니다. conf.d (또는 global.d [비표준])에서 robots.conf를 설정하고 모든 가상 호스트 구성에이를 포함 할 수 있습니다. 다른 모든 답변은 같은 일을하는 다양한 방법을 지적합니다 : proxy_pass, retrun {} 등
anup

답변:


4

http블록 내에서는 위치를 사용할 수 없습니다 . nginx에는 전역 별칭 ​​(즉, 모든 가상 호스트에 대해 정의 할 수있는 별칭)이 없습니다. 전역 정의를 폴더에 저장하고 포함하십시오.

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

질문에서 주어진 것처럼 robots.conf를 conf.d 폴더에 넣어서 시도했습니다. 그러나 그것은 전 세계적으로 작동하지 않습니다.
anup

계속 ... 당신이 말했듯이, Nginx에는 전역 별칭이 없습니다. 결국 해결 방법은 가상 호스트 구성마다 추가하는 것이 었습니다.
anup

43

nginx 설정에서 robots.txt 파일의 내용을 직접 설정할 수 있습니다.

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

올바른 Content-Type을 추가 할 수도 있습니다.

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

1
참고 사항 : 나는 location = /robots.txt(등호를 참고하십시오) 그렇지 않으면 location ~* \.(txt|log)$아래의 다른 일치 항목을 재정의해야했습니다.
Beebee

어떻게 깔끔하게 추가 할 수 conf.d/robots.conf있습니까? 이므로 "위치"지시문은 여기에 허용되지 않는 합리적이다,하지만 특정 서버에 대해이 아니다. @ user79644에 대한 답변이 확실하지 않습니다. 이것을 각 사이트에 추가해야합니까?
Pablo A

나는 이것을 테스트하지 않았습니다. 그러나 별칭 대신 '반환'이 사용된다는 점을 제외하면 문제가 된 것과 유사합니다. 내가 직면 한 문제는 글로벌 환경으로 만드는 것입니다. 즉, 웹 사이트의 모든 .conf에서 반복해서는 안됩니다. Apache에서 작동하는 방식으로 작동하는 전역 방법을 얻을 수 없었습니다. 크롤링해서는 안되는 개발 서버를 예로 들어 보겠습니다.
anup

10

정의 된 다른 규칙이 있습니까? 아마도 common.conf 또는 구성에 우선하는 다른 conf 파일이 포함되어있을 수 있습니다. 다음 중 하나가 제대로 작동합니다.

location /robots.txt { alias /home/www/html/robots.txt; }
location /robots.txt { root /home/www/html/;  }
  1. Nginx는 모든 "regexp"위치를 모양 순서대로 실행합니다. "regexp"위치가 성공하면 Nginx는이 첫 번째 일치를 사용합니다. "regexp"위치가 성공하지 못한 경우 Nginx는 이전 단계에서 찾은 일반 위치를 사용합니다.
  2. "regexp"위치가 "prefix"위치보다 우선합니다

전역 옵션으로는 작동하지 않습니다. 그러나 가상 호스트의 구성 내에서 작동합니다. 첫 번째 (위치 /robots.txt) 및 심지어 내가 지정한 것 ( '~ * /robots.txt')을 사용했습니다. 둘 다 가상 호스트의 구성에서 작동했습니다. 'location' 'if {}'사용이 'server'지시어에 해당하는 것으로 생각되며 이는 아마도 글로벌 수준에서 작동하지 않을 것입니다.
anup

/robots.txt별명을 지정할 파일 이 있는지 확인하십시오 . 나는 root일할 수있는 옵션을 얻지 못했습니다 .
Shadoath

-1

나는 acme challanges와 같은 문제가 있었지만 동일한 원칙이 귀하의 경우에도 적용됩니다.

이 문제를 해결하기 위해 내 사이트를 모두 비표준 포트로 옮기고 8081포트 80에서 수신 대기하는 가상 서버를 만들었습니다 127.0.0.1:8081. .well-known을 제외한 모든 요청을 프록시합니다 . 이것은 거의 하나의 추가 홉을 가진 전역 별명으로 작동하지만 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;
  }
}
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.