
나는 Wordpress 웹 사이트를 가지고 있습니다. .php URL을 .php 접미사가 없는 URL로 리디렉션하고 싶습니다. .htaccess는 다음과 같습니다.
# BEGIN WordPress
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteRule ^(.*)\.php$ "$1" [R=301,L,NC]
RewriteBase /
RewriteRule ^index\.php$ - [L]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . /index.php [L]
</IfModule>
# END WordPress
그런데 제가 방문했을 때https://www.example.com/somepage.php, 페이지를 표시할 수 없습니다. 브라우저에 다음 오류가 표시됩니다.
The page isn’t redirecting properly
An error occurred during a connection to www.example.com.
This problem can sometimes be caused by disabling or refusing to accept cookies.
주소 표시줄의 URL은 다음과 같습니다. https://www.example.com/index.
다시 쓰기 규칙을 다음과 같이 변경하면:
# BEGIN WordPress
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteRule ^(.*)\.html$ "$1" [R=301,L,NC]
RewriteBase /
RewriteRule ^index\.php$ - [L]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . /index.php [L]
</IfModule>
# END WordPress
그리고 방문하세요https://www.example.com/somepage.html, 다음으로 성공적으로 리디렉션되었습니다.https://www.example.com/somepage그리고 웹페이지가 정상적으로 표시됩니다. 왜?
답변1
왜냐하면 리디렉션이무조건적인, 결국 다시 리디렉션하게 됩니다~ 후에index.php
URL이 (WordPress 전면 컨트롤러) 로 다시 작성되었습니다 .
요청할 때 /somepage.php
:
/somepage
(첫 번째 규칙에 따라) 로 리디렉션됩니다 . 리디렉션 응답이 클라이언트로 다시 전송됩니다.- 두 번째 요청에서는 마지막 규칙에 따라
/somepage
내부적으로 다시 작성됩니다 ./index.php
그런 다음 재작성 엔진이 다시 시작됩니다(예배 규칙서문맥)... /index.php
/index
(첫 번째 규칙에 따라) 로 리디렉션됩니다 . 리디렉션 응답이 클라이언트로 다시 전송됩니다.- 세 번째 요청에서는 마지막 재작성
/index
에 의해 내부적으로 재작성됩니다 ./index.php
그런 다음 재작성 엔진이 다시 시작됩니다. - Goto 3(끝없는 리디렉션 루프에 갇혔습니다).
안에예배 규칙서컨텍스트(예 .htaccess
: ) 재작성 엔진은 단순히 스크립트를 한 번만 통과하는 것이 아닙니다. URL이 변경되지 않고 통과될 때까지 반복됩니다. (Apache 2.4에서 플래그를 사용하지 않거나 END
외부 3xx 리디렉션이 발생하지 않는 한)
제거로 변경하면 으로 끝나지 않는 에 .html
다시 작성하므로 제거하는 리디렉션 지시문이 일치하지 않으므로 문제가 없습니다./index.php
.html
.html
이 문제를 해결하려면 다시 작성된 요청을 리디렉션하지 않아야 합니다. 다음 중 하나를 수행하여 이 작업을 수행할 수 있습니다.
재작성 엔진의 추가 루프를 방지하는
END
대신 마지막 재작성 시 플래그(Apache 2.4+)를 사용합니다 .L
스톡 WordPress 지시문(아래 참조)을 변경하지 않아야 하지만 이는 선호되는 옵션이 아닐 수도 있습니다. 이는 Apache 2.2에서도 작동하지 않습니다.또는 서버 변수(HTTP 요청 헤더의 초기 행을 포함하고 요청을 다시 작성할 때 변경되지 않음)
.php
에 대해 확장을 확인하십시오.THE_REQUEST
예를 들어:# Remove ".php" extension on "direct" (not rewritten) requests only RewriteCond %{THE_REQUEST} [A-Z]{3,7}\s/[^?]+\.php(?:\?|\s|$) [NC] RewriteRule (.+)\.php$ /$1 [R=301,L,NC]
또는
REDIRECT_STATUS
초기 요청 시 비어 있고 첫 번째 성공적인 재작성 시 200(예: 200 OK HTTP 상태)으로 설정된 환경 변수를 확인하세요(위의 다소 복잡한 정규식보다 간단함). 예를 들어:# Remove ".php" extension on "direct" (not rewritten) requests only RewriteCond %{ENV:REDIRECT_STATUS} ^$ RewriteRule (.+)\.php$ /$1 [R=301,L,NC]
# BEGIN WordPress
그러나 WordPress 자체가 이를 유지하려고 시도하고 나중에 이 코드를 덮어쓸 수 있으므로 섹션 내부의 코드를 편집해서는 안 됩니다 . 이 규칙은 가야 해~ 전에코멘트 # BEGIN WordPress
마커. RewriteEngine On
파일 뒷부분(WordPress 섹션)에 나타나는 지시문을 반복할 필요가 없습니다 .
잘못된(영구) 리디렉션이 브라우저에 의해 캐시되었을 가능성이 높으므로 테스트하기 전에 브라우저 캐시를 지워야 합니다. 캐싱 문제를 방지하려면 먼저 301(임시) 리디렉션으로 테스트하세요.
.php
그러나 이것만으로는 확장자 가 없는 파일에 액세스할 수 없습니다 .php
. 확장자가 없는 URL은 내부적으로 다시 파일에 다시 작성해야 하기 때문입니다 .php
.