장고 지식)url 끝에 슬래시(/)를 포함해야 하는 이유(APPEND_SLASH)

하얀설표 | 작성시간 2024.06.30.

(2024.06.30. 수정됨.)

주요 파일 경로

config
|- urls.py
|- views.py
|- settings.py

장고의 설정 중에는 "APPEND_SLASH"라는 것이 있습니다.
settings.py에서 별도로 설정하지 않는 경우 True를 기본값으로 가지는데요.
이 설정이 True인 경우 aaa.com/bbb과 같이 url 끝에 슬래시(/)가 없는 url 요청을 받고, aaa.com/bbb에 해당하는 url이 존재하지 않는다면 aaa.com/bbb/처럼 슬래시가 있는 주소로 리다이렉트를 시킵니다.

사람의 시선으로 보면 aaa.com/bbb와 aaa.com/bbb/는 동일한 url로 보이지만, 크롤러(crawler)의 시선에서는 그렇지 않습니다.
대략적인 내용은 구글에서 제공하는 To slash or not to slash에서 확인할 수 있는 내용을 보면 슬래시가 포함된 url은 디렉토리를, 슬래시가 없는 url은 파일을 뜻한다고 합니다.
같은 url처럼 보이지만, 서로 다른 페이지를 보여주는 용도로 사용되었다고 해석할 수 있습니다.

그리고 가장 중요한 점은, 장고는 이 2개의 url을 서로 별개의 url로 취급한다는 것입니다.
장고 공식 문서에서 URL design이라는 항목에서 확인할 수 있긴 하지만, 예시를 보겠습니다.

사전 설정

views.py에 다음과 같이 비교할 코드를 2개 추가합니다.

# config/views.py
...
from django.shortcuts import render, HttpResponse
...
def a(requset):
    return HttpResponse('a reponse')
def b(requset):
    return HttpResponse('b reponse')

APPEND_SLASH = True

settings.py의 APPEND_SLASH가 선언되지 않거나, True인 경우입니다.

/test url이 없는 경우

# config/urls.py
from django.contrib import admin
from . import views
urlpatterns = [
    path('test/', views.b),
]

/test

/test라는 url이 존재하지 않기 때문에 /test/로 리다이렉트되고, "b response"라는 응답을 확인할 수 있습니다.

/test/

"b reponse"라는 응답을 확인할 수 있습니다.

/test url이 존재하는 경우

# config/urls.py
from django.contrib import admin
from . import views
urlpatterns = [
    path('test', views.a),
    path('test/', views.b),
]

/test

/test라는 url이 존재하기 때문에 /test/로 리다이렉트되지 않고, "a response"라는 응답을 확인할 수 있습니다.

/test/

"b reponse"라는 응답을 확인할 수 있습니다.

/test/ url이 없는 경우

# config/urls.py
from django.contrib import admin
from . import views
urlpatterns = [
    path('test', views.a),
]

/test

"a response"라는 응답을 확인할 수 있습니다. /test라는 url이 존재하기 때문에 /test/로 리다이렉트되지 않습니다.

/test/

/test라는 url이 존재하지 않기 때문에 404 not Found를 보여줍니다.

APPEND_SLASH = False

settings.py의 APPEND_SLASH 값이 False로 선언된 경우입니다.

/test url이 없는 경우

# config/urls.py
from django.contrib import admin
from . import views
urlpatterns = [
    path('test/', views.b),
]

/test

/test라는 url이 존재하지 않기 때문에 404 not Found를 보여줍니다. APPEND_SLASH가 비활성 상태이기 때문에 리다이렉트되지 않습니다.

/test/

"b reponse"라는 응답을 확인할 수 있습니다.

/test url이 존재하는 경우

# config/urls.py
from django.contrib import admin
from . import views
urlpatterns = [
    path('test', views.a),
    path('test/', views.b),
]

/test

"a response"라는 응답을 확인할 수 있습니다.

/test/

"b reponse"라는 응답을 확인할 수 있습니다.

/test/ url이 없는 경우

# config/urls.py
from django.contrib import admin
from . import views
urlpatterns = [
    path('test', views.a),
]

/test

"a reponse"라는 응답을 확인할 수 있습니다. APPEND_SLASH가 비활성 상태이기 때문에 리다이렉트되지 않습니다.

/test/

/test/라는 url이 존재하지 않기 때문에 404 not Found를 보여줍니다.

정리

특별한 이유가 있는 것이 아니라면 모든 url의 끝에 슬래시를 붙이고, APPEND_SLASH를 True로 두는 것이 좋습니다.
APPEND_SLASH가 False라면 url 하나를 추가할 때마다 슬래시 유무를 확인하고, 각각의 url에 요청이 왔을 때 어떻게 응답해야하는지 하나하나 신경써야 하기 때문입니다.



이 글의 댓글 기능은 일부러 막아놓았습니다. 궁금한 내용이 있다면 게시판을 이용해주세요!