부적절한 404 수정

단일 페이지 앱은 새 페이지를 로드하지 않고도 다양한 콘텐츠를 표시할 수 있습니다. 이를 위해 링크와 History API에서 클릭 핸들러를 사용합니다. History API를 사용하면 브라우저 세션 기록을 조작할 수 있습니다. 이렇게 하면 다른 페이지 (일반적으로 싱글 페이지 앱에서는 '뷰'라고 함)를 표시할 때 URL을 업데이트할 수 있습니다. 또한 브라우저의 뒤로 버튼이 계속 정상적으로 작동하는지 확인합니다.

이 Codelab에서 단일 페이지 앱을 살펴보세요. 고양이 또는 강아지 이미지를 표시하고 두 동물 간에 전환할 수 있는 링크를 제공합니다. 제대로 작동하는 것 같습니다.

은밀한 404 찾기

안타깝게도 앱에 미묘한 버그가 있습니다. 한번 살펴보겠습니다.

  • 사이트를 미리 보려면 앱 보기를 누른 다음 전체 화면 전체 화면을 누릅니다.
  • 강아지 링크를 클릭합니다. URL이 어떻게 변경되었는지 확인합니다.
  • 앱을 새로고침합니다.

'Cannot GET /doggos'가 포함된 페이지가 표시됩니다. 은밀한 404입니다. 웹 앱 내의 링크만 클릭하면 웹 앱이 제대로 작동하는 것처럼 보이므로 '교활'합니다. 새 브라우저 창에서 URL을 사용하거나 페이지를 새로고침하면 중단됩니다. 문제는 서버가 이러한 URL 요청에 응답하는 방법을 알지 못한다는 것입니다. 웹 앱의 JavaScript 코드는 History API를 사용하여 URL 간에 이동하지만 서버는 이를 어떻게 처리해야 할지 모릅니다. 서버가 요청된 URL에 대해 무엇을 해야 할지 알지 못할 때마다 HTTP 상태 코드 404로 응답합니다. 이 코드를 사용하면 서버에서 요청된 URL에 대한 항목을 찾을 수 없다고 표시합니다.

이 경우 검색엔진은 URL의 색인을 생성하지 않습니다. 사용자가 검색 결과를 클릭했을 때 강아지 사진과 같은 찾고 있던 콘텐츠가 아닌 오류 메시지가 표시되기 때문입니다.

서버 수정

이 프로젝트는 JavaScript로 작성된 express.js 서버를 사용합니다. 서버가 index.html로 응답하고 단일 페이지 앱이 나머지를 처리하도록 서버를 수정하겠습니다.

  • 리믹스하여 수정을 클릭하여 프로젝트를 수정할 수 있도록 합니다.
  • server.js 파일을 선택합니다.

이 파일에는 서버 코드가 포함되어 있습니다. express.js 서버를 설정하고 index.html의 콘텐츠를 전송합니다. 15번 줄의 경로 설정은 요청이 / URL로 이동하는 경우에만 웹 앱을 제공합니다. 서버는 생성한 다른 URL도 제공해야 합니다. 향후 추가 URL에서도 작동하도록 모든 URL을 게재하도록 변경해 보겠습니다.

이렇게 하려면 15번 줄부터 시작하는 코드를 다음과 같이 변경하면 됩니다.

app.get('/*', function(request, response) {
  response.sendFile(__dirname + '/views/index.html');
});

/*는 모든 URL과 일치하며 이제 서버는 주어진 URL에 대해 index.html의 웹 앱으로 응답합니다.

  • 사이트를 미리 보려면 앱 보기를 누른 다음 전체 화면 전체 화면을 누릅니다.

이제 새 시크릿 창에서 링크를 새로고침하고 열면 예상대로 작동합니다.