찾다

 >  Q&A  >  본문

.htaccess 다시 쓰기 규칙 문제

.htaccess 규칙을 다시 작성하는 데 문제가 있습니다. 사용자 이메일의 URL을 비밀번호 재설정을 위한 토큰이 포함된 브라우저에 전달합니다.

현재 .htaccess 규칙:

으아악

사용자가 가려고 할 때

example.com/activate/00803e6632236414ebcdc34c7e7690d764e567083fac6

디버깅 시 이러한 오류가 발생합니다

example.com/activate/00803e6632236414ebcdc34c7e7690d764e567083fac6.php.php.php.php.php.php.php.php.php.php

그래서 아래 댓글을 따라 .htaccess를 다음과 같이 업데이트했습니다.

으아악

다음 오류가 발생합니다:

AH00128: 파일이 존재하지 않습니다: /var/www/html/htdocs/activate/00803e6632236414ebcdc34c7e7690d764e567083fac6

P粉316890884P粉316890884239일 전399

모든 응답(1)나는 대답할 것이다

  • P粉651109397

    P粉6511093972024-03-20 21:37:57

    이 규칙의 문제점은 파일 시스템 경로(예: %{REQUEST_FILENAME}.php)并重写到另一个文件系统路径(.php)。这些不一定指同一件事。对于对 /activate/foo 的请求,其中 activate 不是文件系统目录,则 REQUEST_FILENAME 的格式为 /var/www/html/htdocs/activate (因此文件检查成功,因为 /var/www/html/ htdocs/activate.php 存在),但它将请求重写为 activate/foo.php (使用 反向引用) - 该请求不存在。它将重复执行此操作,每次附加 .php(내부 다시 쓰기 제한에 도달할 때까지, 기본값은 10))를 확인한다는 것입니다.

    참고 #1: request+.php가 파일에 매핑되었는지 확인하기 전에 요청이 파일이 아닌 디렉터리에 매핑되었는지 확인할 필요가 없습니다. 하나만 필요할 때 3개의 (비싼) 파일 시스템 검사가 필요합니다.

    참고 #2: 또한 TestString(첫 번째 인수)에서 리터럴 점을 이스케이프 처리하는 백슬래시가 필요하지 않습니다. 이는 정규식이 아닌 "일반" 문자열이기 때문입니다.

    다시 작성하게 되는 동일한 파일 경로를 테스트할 수 있도록 이 규칙을 수정해야 합니다. 예:

    으아악

    그런 다음 요청을 /activate/ 重写为 /activate.php/ (将 / 경로 정보로 스크립트에 전달하는 추가 규칙이 필요합니다. 이것이 일회성인 경우 "하드코드"될 수 있습니다. 예:

    으아악

    (나는 가 16진수 시퀀스라고 가정하는데, 이는 귀하의 예에서도 해당되는 것 같습니다.)

    또는 유사한 요청이 있는 경우 더 일반적인 요청으로 작성하세요. 예를 들어. /<文件>//<文件>.php/. 예:

    으아악

    나레이션:

    이 규칙(외부 리디렉션)은 위의 재작성보다 우선 해야 합니다.

    회신하다
    0
  • 취소회신하다