Apache에서 재작성 규칙을 무시하고 404의 원인을 찾는 방법

Apache에서 재작성 규칙을 무시하고 404의 원인을 찾는 방법

그래서 나는 이것을 가지고 있습니다

RewriteCond %{REQUEST_URI} (da-dk)/(.*)(/|\.php)$
RewriteRule ^(da-dk)/(.*)(/|\.php)$ /$2$3 [L]

그러나 어떤 이유로 example.com/da-dk/에서는 "404 - 찾을 수 없음"을 제공합니다.

나는 아파치가 왜 그런 결론에 도달했는지, 즉 어떤 규칙을 만나고 따랐는지 이해하고 싶습니다.

답변1

이것이 루트 .htaccess파일에 있다고 가정하면 ...

RewriteRule ^(da-dk)/(.*)(/|\.php)$ /$2$3 [L]

/da-dk/URL 경로와 일치하는 요청이 da-dk/정규식과 일치하지 않으므로 ^(da-dk)/(.*)(/|\.php)$이 규칙이 처리/따르지 않습니다.

따라서 이 요청과 일치하는 다른 규칙이 없으면아니요규칙을 따르므로 404가 됩니다. (어떤 규칙이 "충돌"되는지에 관해서는 음, 다른 모든 규칙은 다음과 같습니다.마주친.)

덧붙여서, 앞선상태( RewriteCond지시문)은 여기에서 완전히 불필요하므로 제거해야 합니다. 그 이상은 아무것도 하지 않습니다.RewriteRule 무늬이미 확립되었습니다.

특히 이 규칙(정규식)은 다음 형식의 URL과 일치합니다.

  • /da-dk/.php
  • /da-dk/<foo>/
  • /da-dk/<foo>.php
  • /da-dk/<foo>/<bar>/<baz>/
  • /da-dk/<foo>/<bar>/<baz>.php

일치하지 않습니다:

  • /da-dk/<foo>
  • /da-dk/

이 규칙은 /da-dk요청된 URL(아마도희망다시 작성된 URL이 파일 시스템 디렉터리 또는 파일과 일치하는지 확인하세요.

/da-dk/루트에 다시 작성해야 하는 경우 이를 허용하도록 위의 규칙을 수정할 수 있습니다(이 과정에서 약간 단순화할 수도 있음). 예를 들어 다음을 대신 시도해 보세요.

RewriteRule ^da-dk/(.+(/|\.php))?$ /$1 [L]

여기에서는 이후의 URL 경로 부분이 da-dk/만들어집니다.선택 과목. (이 경우 $1역참조는 효과적으로비어 있는.)

수량자를 에서 이것 *으로 변경하면 +(말도 안 되는) URL 일치를 피할 수 있습니다 /da-dk/.php.

그럴 필요는 없어포착부분 da-dk(첫 번째 경로 세그먼트)은치환문자열(두 번째 인수).

이제 역 $1참조에는 접두사 뒤의 전체 URL 경로가 포함됩니다 da-dk/. ( 원래 $2와 마찬가지로 필요하지 않습니다 .)$3

관련 정보