루트 URL을 하위 디렉토리로 리디렉션하기위한 .htaccess 재 작성


246

www.example.com

직접 가다

www.example.com/store

여러 비트의 코드를 시도했지만 아무것도 작동하지 않습니다.

내가 시도한 것 :

Options +FollowSymlinks
RewriteEngine on

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

RewriteCond %{HTTP_HOST} ^(.+)\www.example\.com$
RewriteRule ^/(.*)$ /samle/%1/$1 [L]

내가 뭘 잘못하고 있죠?

답변:


275

^ $ 를 사용 하여 루트를 나타내는 다시 쓰기 규칙을 사용 하여 다음과 같이 루트를 / store 디렉토리에 다시 쓸 수 있습니다.

RewriteEngine On
RewriteRule ^$ /store [L]

6
RewriteRule ^ /? $ /index.do [R]
barclay

2
^ / $는 절대 일치하지 않는 것 같아서 ^ /? $는 필요하지 않은 것 같습니다.
NateS

그런 다음 전체 URL을 표시하고 규칙을 계속 처리 할 수 ​​있습니까? 내 경우에는 URL을 다시 작성하여 예쁘게 만듭니다. 이렇게하면 URL example.com이 유지됩니다-example.com/store를 원하고 다른 다시 쓰기를 계속하십시오.
gin93r

나에게도 잘 작동합니다.
Jitesh Sojitra

1
최근에 우분투 아파치 2.4.7의 사이트에서 왜 이것이 작동하지 않는지 디버깅하는 데 많은 시간을 보냈습니다. 다시 쓰기 디버깅은 규칙이 적중되어 내부 리디렉션을 생성하는 것으로 나타났습니다. 그런 다음 그냥 주차하고 색인 페이지를 찾는 것처럼 보였습니다. mod_dir이 활성화되어 있고 dir에 색인 페이지 후보가있는 경우 다음을 설정하지 않은 경우 mod_rewrite를 대체합니다. DirectoryCheckHandler On
Gerrit

142

아무도 이것을 언급하지 않은 것에 놀랐습니다.

RedirectMatch ^/$ /store/

기본적으로 루트 URL과 루트 URL 만 리디렉션합니다. 답변은 이 링크 에서 시작되었습니다


3
고마워, 이것은 이미 존재하는 규칙으로 저에게 효과적이었습니다. 충돌이 없습니다.
thescientist

1
이것은 완벽하게 작동합니다. 또한 http와 https를 모두 다룹니다.
Sayem Shafayet

3
그리고 이것은 301 리디렉션을 위해 :RedirectMatch 301 ^/$ /store/
Andrea

예, 다시 쓰는 것이 더 간단합니다. 감사!
Orden

2
@Andrea 그리고이 302 임시 리디렉션 : RedirectMatch에 302 ^ / $ / 저장 /
Faizan Anwer 알리 Rupani

108

이 시도:

RewriteEngine on
RewriteCond %{HTTP_HOST} ^example\.com$
RewriteRule (.*) http://www.example.com/$1 [R=301,L]
RewriteRule ^$ store [L]

방문 브라우저에 리디렉션 된 URL이 표시되도록하는 외부 리디렉션을 원할 경우 R플래그도 설정하십시오 .

RewriteRule ^$ /store [L,R=301]

4
그것은 아름답게 작동했습니다. sample.com과 www.sample.com은 모두 www.sample.com/store로 리디렉션됩니다. 그게 내가 원하는 것입니다. 검보 감사합니다. 나는 당신의 답변을 많이 배웠고 피드백에 감사드립니다.

1
궁금 www.example.com합니다. 리디렉션 후 URI로 표시 됩니까? 그렇지 않은 경우 어떻게 변경합니까?
stefmikhail

1
♦-왜 솔루션이 아래 샌더보다 나은가? 나는 당신의 마지막 줄이 동일하다는 것을 알지만 그것이 필요한 모든 것이라면 왜 RewriteCondand를 첫 번째로 포함 RewriteRule합니까?
stefmikhail

이 코드가 사용 된 경우 브라우저에 exmple.com/../aboveSubDir을 입력 할 수 있습니까?

@GamErix 이것은 /aboveSubDir브라우저 나 서버 에 의해 해결됩니다 .
Gumbo

79

다음은 하위 디렉토리로 리디렉션하는 데 사용한 것입니다. 이것은 보이지 않고 기존 파일과 일치하는 요청을 통해 여전히 허용합니다.

RewriteEngine on
RewriteCond %{HTTP_HOST} ^(www.)?site.com$
RewriteCond %{REQUEST_URI} !^/subdir/
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)$ /subdir/$1
RewriteCond %{HTTP_HOST} ^(www.)?site.com$
RewriteRule ^(/)?$ subdir/index.php [L]

값으로 site.com 및 subdir을 변경하십시오.


예상대로 작동합니다! 큰!
kachar

홈페이지는 '스텔스'였습니다 ...하지만 링크를 클릭하면 주소 표시 줄에 하위 디렉토리 이름이 표시됩니다 ... 하위 디렉토리 이름이 표시되지 않도록하는 방법이 있습니까?
dsdsdsdsd

4
루트 만-하위 디렉토리를 수행하지 않음
php-b-grader

3
나를 위해 그것은 "내부 서버 오류"를 제공합니다 : /
Pithikos

1
정말 고마워요, 당신은 내가 이것을 정확히 얼마나 오랫동안 찾고 있었는지 모릅니다.
기본 욕망

26

루트에서 하위 폴더로의 보이지 않는 리디렉션을 설정하려면 /root/.htaccess에서 다음 RewriteRule을 사용할 수 있습니다.

RewriteEngine on

RewriteCond %{REQUEST_URI} !^/subfolder
RewriteRule ^(.*)$ /subfolder/$1 [NC,L]

위의 규칙은 내부적으로 브라우저를 다음에서 리디렉션합니다.

브라우저는 루트 폴더에 남아 있습니다.


1
이것은 허용되는 답변이어야합니다 ... RewriteRule과 함께 (다른 답변에서 제안한대로) / subfolder가 / subfolder / subfolder 등으로 리디렉션되기 때문에 무한 리디렉션이 발생합니다. RewriteCond % {REQUEST_URI}! ^ / subfolder URL이 이미 리디렉션의 경우는 다시하지있어 있는지 확인합니다
패트릭

21

URL을 다시 작성하고 원래 URL을 숨기려는 경우 다른 대안 :

RewriteEngine on
RewriteRule ^(.*)$ /store/$1 [L]

이것으로 예를 들어 type http://www.example.com/product.php?id=4인 경우 파일을 투명하게 열지 http://www.example.com/store/product.php?id=4만 사용자에게 전체 URL을 표시하지 않습니다.


2
추가 QSA로 (쿼리 문자열 APPEND)을 [L]( [L, QSA]당신이 원하는 경우에 쿼리 문자열이 다시 URL로-이월).
devios1

@chaiguy는 팁을 주셔서 감사하지만 내 서버에서는 QSA없이 작동했지만 QSA를 추가하는 것이 좋습니다. 어쩌면 아파치 서버의 특별한 구성 때문일 수 있습니까?
gaborous

1
example.com이 나를위한이 방법은 example.com/store의 콘텐츠를 투명하게 표시하지만 example.com/test는 example.com/store/test로 리디렉션되어 URL을 보여줍니다.
Geoffrey Hale

14

가장 간단한 해결책 인 것 같습니다.

RewriteEngine on
RewriteCond %{REQUEST_URI} ^/$
RewriteRule (.*) http://www.example.com/store [R=301,L]

다른 솔루션 중 일부와 함께 리디렉션 루프가 발생했습니다.


2
이것은 디렉토리를 숨기지 않습니다
php-b-grader

8

귀하의 질문을 이해하지 못합니다 ...

모든 요청을 하위 폴더로 리디렉션하려는 경우 :

RewriteRule ^(.*)$ shop/$1 [L,QSA]

http://www.example.com/* -> wwwroot/store/*

도메인 이름이있는 하위 폴더로 리디렉션하려는 경우

RewriteCond %{HTTP_HOST} ([^\.]+\.[^\.]+)$
RewriteRule ^(.*)$ %1/$1 [L,QSA]

http://www.example.com/* -> wwwroot/example.com/*

([^\.]+\.[^\.]+)$도메인을 하위 폴더 이름으로 예약하는 코드 가 마음에 듭니다.
Chetabahana

6

순환 리디렉션을 피하려면 리디렉션 범위를 루트 디렉토리로 제한하는 것이 중요합니다. 나는 다음을 사용했을 것이다.

RewriteEngine on
RewriteCond %{REQUEST_URI} ^/$
RewriteRule (.*) http://www.example.com/store [R=301,L]

6

위의 솔루션은 대부분 정확하지만 리디렉션의 투명성이 누락되었습니다.

필자의 경우 www.example.com을 방문 하면 URL을 www.example.com/store로 업데이트하지 않고 하위 디렉토리 / store로 리디렉션하려고했습니다 . (내가 원하는 것은 해당 디렉토리에서 페이지 코드를 얻는 것입니다). 귀하의 경우 아래 솔루션이 완벽하게 작동합니다.

RewriteEngine on
RewriteCond %{HTTP_HOST} example\.com [NC]
RewriteCond %{REQUEST_URI} ^/$
RewriteRule ^(.*)$ /store/$1 [L]

출처 : http://wiki.dreamhost.com/Transparently_redirect_your_root_directory_to_a_subdirectory


www.example.com이 URL을 업데이트하지 않고 www.othersite.com/store로 리디렉션되도록하려면 어떻게해야합니까? 시도했지만 코드를 조정할 수 없습니다
단계

마지막 줄을 변경하려고했지만 RewriteRule ^(.*)$ http://otherpage.com/subfolder/$1 [L]URL이 업데이트되었습니다.
단계

당신이 필요로하는 모든 단어 교체하는 것입니다 examplestore.
Mahmoud Zalt

나는 잘 설명하지 않았다. 나는 도메인을 소유 example.com하고 otherpage.com있습니다. 내가 방문 할 때 example.com내가로부터 내용이 있음을 원하는 otherpage.com/subfolder표시하는 URL을 업데이트하지 않고
단계

글쎄, 위의 대답은 그렇게하지 않습니다. 새로운 질문을 게시하십시오.
Mahmoud Zalt


4

이전에는 각 도메인 / 하위 도메인의 루트 URL을 해당 하위 / 도메인으로 정확하게 이름이 지정된 하위 디렉토리로 리디렉션하는 데 올바르게 작동하는 다음 코드를 사용합니다.

RewriteCond %{HTTP_HOST} ^sub1.domain1.com
RewriteCond %{REQUEST_URI} !subs/sub1.domain1.com/
RewriteRule ^(.*)$ subs/%{HTTP_HOST}/$1 [L,QSA]

RewriteCond %{HTTP_HOST} ^sub2.domain1.com
RewriteCond %{REQUEST_URI} !subs/sub1.domain2.com/
RewriteRule ^(.*)$ subs/%{HTTP_HOST}/$1 [L,QSA]

RewriteCond %{HTTP_HOST} ^sub1.domain2.com
RewriteCond %{REQUEST_URI} !subs/sub1.domain2.com/
RewriteRule ^(.*)$ subs/%{HTTP_HOST}/$1 [L,QSA]

RewriteCond %{HTTP_HOST} ^sub2.domain2.com
RewriteCond %{REQUEST_URI} !subs/sub2.domain2.com/
RewriteRule ^(.*)$ subs/%{HTTP_HOST}/$1 [L,QSA]

그러나 다른 하위 또는 도메인을 추가하려면 위 코드에 추가해야합니다. 아래와 같이 와일드 카드 (*)처럼 작동하도록 단순화하는 것이 훨씬 편리해야 합니다.

RewriteCond %{HTTP_HOST} ^sub
RewriteCond %{REQUEST_URI} !/subs/
RewriteRule ^(.*)$ subs/%{HTTP_HOST}/$1 [L,QSA]

따라서 하위 도메인 이름에 하위 접두사 (sub3.domain1.com, sub1.domain3.com 등) 가있는 한 다른 하위 도메인 / 도메인이 추가 될 때마다 코드는 계속 유효합니다.


3

게시 한 코드의 주요 문제는 다음과 같습니다.

  • 첫 번째 줄은 엄격하게 sample.com으로 시작하는 호스트에서 일치하므로 www.sample.com은 일치하지 않습니다.

  • 두 번째 줄은 하나 이상의 문자를 원하고 그 뒤에도 일치하지 않는 www.sample.com이 필요합니다 (첫 번째 w를 왜 탈출 했습니까?)

  • 포함 된 규칙 중 어느 것도 목표에 지정한 URL로 리디렉션되지 않습니다 (또한 샘플은 samle로 철자가 틀리지 만 관련이 없습니다).

참고로 현재 가지고있는 코드는 다음과 같습니다.

Options +FollowSymlinks
RewriteEngine on

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

RewriteCond %{HTTP_HOST} ^(.+)\www.sample\.com$
RewriteRule ^/(.*)$ /samle/%1/$1 [L]

2

약간의 인터넷 검색 결과는 다음과 같습니다.


RewriteBase On RewriteBase /
RewriteRule ^ index. (. *)? $ http://domain.com/subfolder/ [r = 301]

그러면 파일의 존재 여부에 관계없이 index.something 파일에 대한 액세스 시도가 하위 폴더로 리디렉션됩니다.

또는 이것을 시도하십시오 :

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

.htaccess 파일에서 많은 리디렉션을 수행하지 않았으므로 이것이 작동하는지 확실하지 않습니다.


2

이를 달성하기위한 가능한 해결책 중 두 가지 방법은 다음과 같습니다. 1. .htaccess루트 폴더에 아래와 같이 파일을 작성하십시오 (example.com 및 my_dir을 해당 값으로 바꾸십시오).

<IfModule mod_rewrite.c>
RewriteEngine on
RewriteCond %{HTTP_HOST} ^(www.)?example.com$
RewriteCond %{REQUEST_URI} !^/my_dir/
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)$ /my_dir/$1
RewriteCond %{HTTP_HOST} ^(www.)?example.com$
RewriteRule ^(/)?$ my_dir/index.php [L] 
</IfModule>
  1. 루트 URL“/”만 다른 폴더 나 URL로 리디렉션하려면 RedirectMatch를 사용하십시오.

    RedirectMatch ^ / $ http://www.example.com/my_dir


1

htaccess에서 아래 줄을 사용하십시오.

참고 : default.html의 이름을 확인해야 할 수도 있습니다.

default.html은 기본적으로 루트 폴더에로드되는 파일입니다.

RewriteEngine

Redirect /default.html http://example.com/store/


0

이 코드를 .htaccess 파일에 추가하기 만하면됩니다.

<IfModule mod_rewrite.c>
    RewriteEngine On
    RewriteBase /
    RewriteRule ^index\.php$ - [L]
    RewriteCond %{REQUEST_FILENAME} !-f
    RewriteCond %{REQUEST_FILENAME} !-d
    RewriteRule . /folder/index.php [L]
</IfModule>

0

나는 다른 가능한 구문 (다른 답변들 중 많은 것들이 있음)을 지적하는 것이 아니라 한 번 다루어야했던 것을 지적함으로써 원래의 질문에 대답 할 것입니다.

What am I doing wrong?

% {HTTP_HOST}이 (가) 올바르게 채워지지 않았거나 전혀 채워지지 않았을 수 있습니다. 비록 일부 사용자 정의 패치 아파치 2.2가있는 공유 호스트의 한 시스템에서만 발생하는 것을 보았지만 그럼에도 불구하고 가능성이 있습니다.


0

파일이 루트에 존재하지 않으면 하위 디렉토리를 시도합니다. 루트 수준에서 실행될 것으로 예상되는 기본 .html 웹 사이트를 이동하여 하위 디렉토리로 푸시 할 때 필요했습니다. 모든 파일이 평평한 경우에만 작동합니다 (하위 디렉토리에 .htaccess 속임수가 없음). css 및 js 파일과 같은 링크 된 항목에 유용합니다.

# Internal Redirect to subdir if file is found there.
RewriteEngine on
RewriteCond %{DOCUMENT_ROOT}/%{REQUEST_URI} !-s
RewriteCond %{DOCUMENT_ROOT}/subdir/%{REQUEST_URI} -s
RewriteRule ^(.*)$ /subdir/$1 [L]
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.