.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.