환경: nginx 버전은 1.2.6
최근 프로젝트 작업 중 이상한 문제가 발생했습니다. URL을 다시 디자인하고 싶어서 다음과 같은 nginx 재작성 규칙을 사용했습니다.
이 다시 쓰기 규칙은 일반적으로 사용되는 문제가 있는지 모르겠습니다~(조언 부탁드립니다)
이 규칙을 사용하지 않았을 때 서버의 기존 디렉터리에 액세스할 때 슬래시가 자동으로 추가되었습니다. 이때 nginx의 자동 다시 쓰기 규칙이 실행되는 것은 정상이며 문제가 없습니다.
하지만 위의 규칙을 추가한 후에는 서버에 이미 존재하는 폴더에 액세스할 때 슬래시가 자동으로 추가되지 않습니다. 또한, 반복적인 테스트 결과 두 번째와 세 번째 규칙이 문제를 일으키는 것으로 나타났습니다.
1. 두 번째 규칙만 삭제하면 폴더 존재 여부에 관계없이 존재하지 않는 것으로 감지되고 슬래시가 추가되지 않으며 세 번째 규칙이 직접 입력되어 최종적으로 색인과 일치됩니다. .php 이때 파일별로 처리되는 것을 볼 수 있다.
2. 두 번째 규칙이 삭제되면 세 번째 규칙에 따라 파일-f
改为 -e
, 즉 파일 또는 폴더가 결정됩니다.
이제 문제는 해결되었습니다. 디렉터리가 있으면 자동으로 슬래시가 추가되고, 없으면 일치하여 index.php가 입력됩니다.
너무 헷갈립니다. 조언 좀 부탁드립니다. 왜 이럴까요?
또한 프로젝트의 일부 원래 문제로 인해 세 번째 규칙에 다른 대상 재작성 규칙이 많이 있으므로 입력이 폴더이고 일치하는 경우 세 번째 규칙을 입력하고 싶지 않습니다. 성능에 미치는 영향은 크지 않지만 규칙입니다.
많은 테스트 끝에 제가 직접 알아냈습니다.
이 세 가지 규칙에는 아무런 문제가 없으며, 앞서 말한 것처럼 두 번째 규칙도 이상하지 않습니다.
먼저 nginx는 사용자 정의 규칙에 따라 일치합니다. 입력한 경로가 존재하고 끝에 슬래시가 포함되어 있지 않으면
index.php가 내 폴더
$request_filename/index.php
匹配第二条规则成功,注意这里的/
에 존재하므로 후속 매칭을 수행합니다. 즉, 이 폴더가 존재하고 이 폴더에 index.html 또는 index.php가 있는 한 위에서 제시한 첫 번째 또는 두 번째 규칙과 일치하므로 의심의 여지가 없습니다.따라서 첫 번째 또는 두 번째 규칙 이후 일치를 피하고 폴더가 존재할 때 자동으로 슬래시를 추가하려면 첫 번째 규칙 전에 폴더에 대한 판단을 추가하는 것이 해결책입니다.
으아아아이 규칙의 의미는 폴더가 존재하고 슬래시가 없으면 자동으로 슬래시를 추가하고 301 점프를 수행하여 문제가 해결된다는 것입니다.
마지막 논리는 이전 조건이 충족되지 않으면 "접근한 경로가 파일이 아닌 경우" 자동으로 /index.php로 점프한다는 것입니다.
제안: 세 번째 항목 앞에 문장 -e를 삽입하여 폴더인지 확인하세요. 그렇다면 자동으로 슬래시와 줄 바꿈을 추가하세요.
테스트되지 않았으며 참고용으로만 사용하세요.