.htaccess mod_rewrite-재 작성 규칙에서 디렉토리를 제외하는 방법


145

내 .htaccess 파일에 8 줄의 다시 쓰기 규칙이 있습니다. 이 규칙에서 서버의 물리적 디렉토리 두 개를 제외해야 액세스 할 수 있습니다. 지금은 모든 요청이 index.php 파일로 전송됩니다.

제외 할 디렉토리 : "admin"및 "user"

따라서 http 요청 : http://www.domain.com/admin/ 은 index.php 파일로 전달해서는 안됩니다.

ErrorDocument 404 /index.php?mod=error404

Options  FollowSymLinks
RewriteEngine On
RewriteBase /

RewriteCond %{HTTP_HOST} !^www\.domain\.com$ [NC]
RewriteRule ^(.*)$ http://www.domain.com/$1 [R=301,L]

RewriteRule ^([^/] )/([^/] )\.html$ index.php?lang=$1&mod=$2 [L]
RewriteRule ^([^/] )/$ index.php?lang=$1&mod=home [L]

[^/]공간이 허용되지 않으면 일반 공간 이후로 수량자를 잊어 버린 것 같습니다 (이스케이프 처리해야 함 \<space>).
— Gumbo December

진정한 검보, 좋은 캐치 :). ^ ([^ /] +) 여야합니다.
— Kelvin

답변:


287

다른 규칙보다 먼저이 규칙을 시도하십시오.

RewriteRule ^(admin|user)($|/) - [L]

다시 쓰기 과정이 종료됩니다.


안녕하세요 Gumbo, 사용자 유형 domain.com/admin/ (끝 슬래시 포함)이 없으면 코드가 작동합니다. 두 경우 모두 변경 될 수있는 사항이 있습니까? 감사합니다
— Kelvin

@Kelvin : 교대 ($|/)는 두 경우 모두를 처리해야합니다.
— Gumbo

RewriteRule 대신 RewriteCond를 사용하는 것이 좋지 않습니까?
— rineez

7
@rineez RewriteCond는 항상 RewriteRule첨부되어 있어야합니다. 그리고이 조건 RewriteCond을 모든 사람 에게 부정으로 추가하는 것은 RewriteRule상당히 부피가 클 수 있습니다 RewriteRule.이 경우 무시 해야하는 것보다 높은 출구 인 단일 것이 더 우아합니다.
— Gumbo

3
@Ergec "아무것도 변경하지 마십시오"라는 의미입니다.
— Gumbo

112

당신이 할 수있는 일은 포함 된 .htaccess 파일을 넣는 것입니다.

RewriteEngine Off

트리에서 더 높은 .htaccess 파일의 규칙에 따라 다시 쓰지 않으려는 폴더에서. 간단하지만 효과적인.


18
+1 ~ .htaccess는 계층 적으로 작동하므로 CSS 나 MVC의 일반 캐스케이드처럼 로컬 폴더가 상위 폴더보다 우선합니다.
— Atari

4
.htaccess 파일을 활성화하면 ( 아파치 구성 AllowOverride이외의 다른 것으로 None설정) 아파치가 모든 요청에서 .htaccess를 검색하게합니다. 따라서 파일 시스템 / 하드 디스크 액세스가 빈번한 웹 사이트 / 웹 서버를 사용하는 경우 성능에 큰 영향을 미칠 수 있습니다.
— bohrsty

파일 방법을 통해 SSL 인증서 갱신을 확인하기위한 완벽한 조언. 임시 디렉토리 외부 또는 vhost 파일에서 아무것도 수정할 필요가 없습니다. 유효성 검사가 완료되면 전체 폴더를 삭제하기 만하면됩니다. 그냥 좋아요
— Countzero

25

다음과 같이 관리 디렉토리를 점검하기위한 조건을 추가하십시오.

RewriteCond %{REQUEST_URI} !^/?(admin|user)/
RewriteRule ^([^/] )/([^/] )\.html$ index.php?lang=$1&mod=$2 [L]

RewriteCond %{REQUEST_URI} !^/?(admin|user)/
RewriteRule ^([^/] )/$ index.php?lang=$1&mod=home [L]

안녕하세요 Rob, "RewriteBase /"바로 뒤에이 줄을 입력했는데 이제 "500 오류-내부 서버 오류"가 표시됩니다.
— Kelvin

@ 켈빈 내 대답을 편집하고 적용하려는 각 규칙 앞에 조건을 추가하십시오.
— Rob

이것은 실제로 나를 돕는 유일한 사람이었습니다. 허용 대답은 않았다 하지 나에게 도움이됩니다.
— Uwe Keim

5

규칙에서 특정 디렉토리를 제거하려면 (즉, foo 디렉토리를 제거하려는 경우 ) 다음을 사용할 수 있습니다.

RewriteEngine on

RewriteCond %{REQUEST_URI} !^/foo/$
RewriteRule !index\.php$ /index.php [L]

위의 rewriteRule 은 / foo / 요청을 제외한 모든 요청을 /index.php에 다시 작성합니다 .

존재하는 모든 디렉토리를 제외하려면 규칙 위에 다음 조건을 사용해야합니다.

RewriteCond %{REQUEST_FILENAME} !-d

다음 규칙

RewriteEngine on

RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule !index\.php$ /index.php [L]

/index.php에 모든 것을 (디렉토리 제외) 재 작성합니다 .


5

다음과 같은 mod_rewrite 규칙을 사용했습니다.

RewriteEngine on
RewriteCond %{REQUEST_URI} !^/test/
RewriteCond %{REQUEST_URI} !^/my-folder/
RewriteRule (.*) http://www.newdomain.com/$1 [R=301,L]

이는 / test 및 / my-folder 디렉토리의 리소스에 대한 요청을 제외하고 사이트에 대한 모든 트래픽을 http://www.newdomain.com 으로 리디렉션합니다 (301 리디렉션으로 영구적으로) . (. *) 캡처 그룹을 사용하고 새 URL에 $ 1을 포함시켜 요청한 정확한 리소스로 사용자를 이동시킵니다. 공간을 염두에 두십시오.


당사 사이트를 사용함과 동시에 당사의 쿠키 정책과 개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.