다음과 같이 호스트 이름 바로 뒤에 오는 매개변수를 가지려고 합니다.
www.domain.com/parameter
이러한 이유로 작동하려는 두 매개변수 값에 대해 다음 rewriteRule을 설정했습니다.
RewriteRule ^(en|pt)$ /index.php?language=$1&%{QUERY_STRING} [L]
잘 작동해요! 하지만 나열된 매개변수 없이 요청을 리디렉션하려면 새 규칙을 만들어야 합니다.
그런 이유로 나는 이것이 효과가 있을 것이라고 생각했습니다.
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_URI} !^(en|pt)$
RewriteRule ^(.*)$ /pt/$1/ [L,R=301]
그러나 불행하게도 리디렉션 루프가 표시됩니다.
나는 다음과 같은 결과를 얻었습니다:
http://hostname/pt/pt/pt/pt/pt/pt/pt/pt/pt/pt/pt/pt/pt/pt/pt/pt/pt/pt/pt/pt/pt//
이 문제를 해결하는 방법에 대한 조언을 주시면 감사하겠습니다!
답변1
그것은 ~ 때문에디렉토리아니다일반 파일.
http://httpd.apache.org/docs/current/mod/mod_rewrite.htmlid
( 스니펫에는 HTML DOM이 없습니다 . 가장 가까운 것은 관련이 없으며 LA-U
, 있어야 할 항목도 id="LA-F"
누락되었습니다!)
다양한 파일 속성 테스트를 수행할 수 있습니다.
'-d' (is directory) Treats the TestString as a pathname and tests whether or not it exists, and is a directory. '-f' (is regular file) Treats the TestString as a pathname and tests whether or not it exists, and is a regular file.
구성의 나머지 부분이 올바른 경우(뒤에 슬래시를 추가하는 것이 좋은 생각인지 잘 모르겠습니다) 다음에 대한 추가 조건을 추가해야 합니다 !-d
.
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_URI} !^(en|pt)$
RewriteRule ^(.*)$ /pt/$1/ [L,R=301]
또한 nginx로 전환하는 것도 고려해 보세요! 일반적인 사용에 더 적합한 명확한 구문을 갖고 있을 뿐만 아니라 관련 문서에 대한 직접 링크도 제공합니다.http://nginx.org/r/if.
"-e" 및 "!-e" 연산자를 사용하여 파일, 디렉터리 또는 기호 링크 존재 여부를 확인합니다.
답변2
%{REQUEST_URI}
호스트 이름 바로 뒤에 오는 URI 경로이므로 슬래시로 시작합니다./
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_URI} !^/(en|pt)$
RewriteRule ^.*$ /pt/$0/ [R=301,L]