본문 바로가기

개발하자

FastAPI에서 오리진 URL을 얻는 방법은?

반응형

FastAPI에서 오리진 URL을 얻는 방법은?

FastAPI에서 요청이 온 URL을 얻을 수 있나요?

예를 들어 에서 요청한 엔드포인트가 있고 에서 이 엔드포인트로 요청이 이루어진 경우 엔드포인트 함수에서 "www.othersite.com" 문자열을 검색할 수 있는 방법이 있습니까?




다음과 같이 공식화될 수 있는 질문의 전제

서버는 요청이 온 URL을 식별할 수 있습니다

잘못 짚었다. 사실, 일부 HTTP 요청(특히 브라우저에서 발급한 요청 중 일부)은 및/또는 a를 전송합니다. 또한, 요청이 발급된 위치에 대한 정보가 있는 경우 에 포함됩니다. 그러나 HTTP 사양에서는 일반적으로 요청이 어디에서 왔는지를 광고하도록 요구하지 않습니다.

따라서, Fast를 사용하는지 여부API 또는 다른 서버 기술, 요청이 어디서 왔는지를 알 수 있는 확실한 방법은 없습니다.




에 따라, 그리고 따라서:

경로 연산 기능의 내부를 얻고 싶다고 가정해 보겠습니다.

@app.get("/items/{item_id}")
def read_root(item_id: str, request: Request):
    client_host = request.client.host
    return {"client_host": client_host, "item_id": item_id}

이 경우 Uvicorn을 실행하여 이러한 헤더를 허용해야 합니다(기본적으로 이미 활성화되어 있지만 구성에서 연결 IP만 신뢰하도록 제한됨). 또한 도메인 소켓이 프록시 헤더의 소스로 신뢰되도록 하려면 플래그를 사용해야 합니다(모든 IP에서 헤더를 신뢰하는 대신)와일드카드에서는 역방향 프록시 서버의 IP에서 프록시 헤더를 신뢰하는 것이 더 안전합니다. 기준:

  • - 활성화/비활성화 , 원격 주소 정보를 채웁니다. 기본값은 로 설정되지만 구성에서 연결 IP를 신뢰하는 것으로 제한됩니다.

  • - 쉼표로 구분됨. 사용 가능한 경우 기본값은 환경 변수입니다. 와일드카드는 신뢰를 의미합니다.

프록시에서 전달되도록 하려면 및 헤더가 프록시에 의해 설정되어 있는지 확인해야 합니다(자세한 내용은 및 을 참조하십시오).

업데이트 1

API에 대한 요청이 프론트에서 직접 API에 대한 요청을 발행하는 것이 아니라 해당 웹 사이트에 의한 것이라고 가정합니다. 따라서 클라이언트의 IP 주소는 웹 사이트를 검색하는 사용자의 IP 주소가 아니라 웹 사이트의 (서버/백엔드) IP 주소입니다ebsite의 IP 주소는 아래와 같이 역 DNS 조회를 수행하여 웹 사이트의 호스트 이름을 가져올 수 있습니다(항상 존재하지는 않거나 의미 있는 이름이 없습니다). 거기서 호스트 이름 또는 IP 주소 자체에 대한 정보를 온라인에서 찾을 수 있습니다. 나중에 참조할 수 있도록 확인하는 모든 IP 주소(또는 더 나은 호스트 이름)로 데이터베이스를 만들 수도 있습니다.

import socket
#address = '2001:4860:4860::8888' # Google's Public DNS IPv6 address
address = '216.58.214.14' # a Google's IP address
print(socket.gethostbyaddr(address)[0])

업데이트 2

@jub0bs의 답변에서 언급했듯이, HTTP 요청은 일반적으로 리소스가 요청된 주소를 포함하는 헤더를 전송합니다. 기준:

HTTP 요청 헤더는 리소스가 요청된 절대 또는 부분 주소를 포함합니다. 헤더를 통해 서버는 사용자가 방문 중이거나 요청된 리소스가 사용 중인 곳으로 이동할 수 있습니다. 이 데이터는 분석, 로깅, 최적화된 캐슁 등에 사용할 수 있습니다.

링크를 누르면 에 링크가 포함된 페이지의 주소가 포함됩니다. 다른 도메인에 리소스 요청을 하는 경우.

FastAPI에서는 표시된 대로 요청 헤더를 검색할 수 있습니다. 따라서 다음과 같은 방법으로 URL을 얻을 수 있습니다:

from fastapi import FastAPI, Request

app = FastAPI()

@app.get('/')
def main(request: Request):
    referer = request.headers.get('referer')
    return referer

반응형