[그누6실서비스]=Uvicorn_server에서 크롤러(crawler)를 차단할 방법을 알고 싶습니다.
본문
Localhost에 아파치(2.4.52)와 그누보드6(6.0.3)실서비스(https://sir.kr/g6_tip?sca=&sfl=wr_subject&stx=%EA%B7%B8%EB%88%846%EC%8B%A4%EC%84%9C%EB%B9%84%EC%8A%A4)를 사용 중입니다.
그누보드6_설치_루트(DocumentRoot)에 robots.txt와 사이트맵(xxx.xml)을 업로드 하였으나,
읽히지 않는군요(https://policy.glitter.kr/qa_php/map_txt.png).
여러모로 노력하였으나, FastAPI 프레임워크를 모른체 범접한 이가
Uvicorn_server에서 크롤러(crawler)를 차단하는 방법을 찾기란 쉽지 않습니다.
- Localhost 정보는 아래와 같습니다.
root@HumanpcNAS:~# uname && uname -r
Linux
6.1.20-efm-standard
.
root@HumanpcNAS:~# python3 -V
Python 3.9.9
.
root@HumanpcNAS:~# cat requirements.txt
.
fastapi>=0.103.2
.
root@HumanpcNAS:~# httpd -v
Server version: Apache/2.4.52 (Unix)
.
= = = 조언 부탁드립니다. = = =
!-->답변 1
몇가지 방법을 응용해서 한번 해보시겠어요..
1. FastAPI 미들웨어로 User-Agent 기반 차단
from fastapi import FastAPI, Request, Response
from starlette.middleware.base import BaseHTTPMiddleware
from starlette.responses import JSONResponse
app = FastAPI()
class BlockCrawlerMiddleware(BaseHTTPMiddleware):
async def dispatch(self, request: Request, call_next):
user_agent = request.headers.get('user-agent', '')
if 'crawler' in user_agent.lower() or 'bot' in user_agent.lower():
return JSONResponse(status_code=403, content={"detail": "Access forbidden: Crawler detected"})
response = await call_next(request)
return response
app.add_middleware(BlockCrawlerMiddleware)
@app.get("/")
def read_root():
return {"message": "Hello, world"}
@app.get("/robots.txt")
def get_robots_txt():
return Response(content="User-agent: *\nDisallow: /", media_type="text/plain")
2. .htaccess 파일 설정 (Apache 서버)
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteCond %{HTTP_USER_AGENT} (crawler|bot) [NC]
RewriteRule ^ - [F,L]
</IfModule>
3. IP 차단
from fastapi import FastAPI, Request, HTTPException
from starlette.middleware.base import BaseHTTPMiddleware
app = FastAPI()
BLOCKED_IPS = ["192.168.0.1", "10.0.0.1"]
class BlockIPMiddleware(BaseHTTPMiddleware):
async def dispatch(self, request: Request, call_next):
client_ip = request.client.host
if client_ip in BLOCKED_IPS:
raise HTTPException(status_code=403, detail="Access forbidden: Your IP is blocked")
response = await call_next(request)
return response
app.add_middleware(BlockIPMiddleware)
@app.get("/")
def read_root():
return {"message": "Hello, world"}