htaccess를 사용하여 모두 index.php로 리디렉션


131

저는 간단한 PHP 기반 MVC-ish 프레임 워크를 작성하고 있습니다. 이 프레임 워크를 모든 디렉토리에 설치할 수 있기를 바랍니다.

내 PHP 스크립트는 요청 URI를 가져 와서 세그먼트로 나눕니다. 세그먼트 1을 컨트롤러로 만들고 세그먼트 2를 동작으로 만듭니다. 이렇게하면 잘됩니다.

http://www.example.com/mvc/module/test/

특정 모듈 컨트롤러 및 방법으로 이동합니다. 이제 기본 컨트롤러 인 홈 컨트롤러가 폴더 홈에 있습니다.

이제이 폴더에 직접 액세스하면 http://www.example.com/mvc/home/ 403 금지가 표시됩니다.이 폴더가 존재하기 때문에 대신 http://www.example.com 으로 돌아 가야합니다 . /mvc/index.php

프레임 워크를 다른 폴더에 설치했다면 폴더 프레임 워크를 http://www.example.com/framework/index.php로 다시 리디렉션해야합니다 .

모든 폴더와 PHP 파일을 index.php로 다시 리디렉션하고 나머지는 그대로 둡니다.

내 첫 번째 문제는 올바른 폴더로 리디렉션되지 않고 항상 도메인 루트 폴더로 리디렉션된다는 것입니다.

이것이 내가 시도한 것입니다.

RewriteEngine on
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule . index.php [L]

질문을 올바르게 이해했는지 확인하기 위해 모든 요청을 루트 index.php 로 리디렉션하거나 해당 특정 폴더에 대한 모든 요청을 리디렉션하고 싶 index.php습니까?
Technoh

htaccess 파일이있는 폴더, 프레임 워크 루트 디렉토리. 내 예에서 mvc 디렉토리로 돌아 가기
David Ericsson

답변:


259

재 작성 규칙은 거의 괜찮아 보입니다.

먼저 .htaccess파일이 문서 루트 (와 같은 위치)에 있는지 확인하십시오.index.php )에 있는지 또는 있는 하위 폴더 (및 그 안의 모든 하위 폴더-재귀 적으로)에만 영향을 주는지 확인합니다.

다음으로 규칙을 약간 변경하여 다음과 같이 보이도록합니다.

RewriteEngine on
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)$ /index.php?path=$1 [NC,L,QSA]

당신은 단지에 일치하고있는 시점에서 .이는 모든 문자의 경우, 당신은 적어도 필요한 .*모든 문자의 인스턴스의 수와 일치 할 수 있습니다.

$_GET['path']변수는 그래서, 가짜 디렉토리 구조를 포함 할 것이다 /mvc/module/test당신이 다음 결정의 index.php에서 사용할 수있는 인스턴스에 대한 컨트롤러 수행 할과 행동을.


전체 shebang을 하위 디렉토리에 설치하려는 경우 /mvc/또는 /framework/가장 덜 복잡한 방법은이를 고려하여 다시 쓰기 규칙을 약간 변경하는 것입니다.

RewriteRule ^(.*)$ /mvc/index.php?path=$1 [NC,L,QSA]

그리고 파일이 문서 루트에있는 index.php동안 해당 폴더에 있는지 확인하십시오 .htaccess.


대안$_GET['path'] ('18 년 2 월 및 '19 년 1 월 업데이트)

경로$_GET변수 로 설정하는 것이 실제로 필요하지 않으며 (지금도 일반적이지 않음) 많은 프레임 워크가 $_SERVER['REQUEST_URI']동일한 정보를 검색하는 데 의존합니다 ( 일반적으로 사용할 컨트롤러 를 결정 하기 위해). 그러나 원칙은 정확히 동일합니다.

이것은 경로 매개 변수 RewriteRule를 만들 필요가 없기 때문에 약간 단순화 됩니다 (즉, OP의 원본 이제 작동 함을 의미합니다 ).RewriteRule

RewriteEngine on
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^.*$ /index.php [L,QSA]

그러나 하위 디렉토리에 설치하는 규칙은 여전히 ​​적용됩니다.

RewriteRule ^.*$ /mvc/index.php [L,QSA]



플래그 :

NC = 대소 문자 없음 (대소 문자를 구분하지 않고 패턴에 문자가 없으므로 실제로 필요하지 않음)

L = 마지막 (이 재 작성 후 재 작성이 중지되므로 재 작성 목록에서 마지막 항목인지 확인하십시오)

QSA= 쿼리 문자열 추가, ?like=penguins마지막에 유지하고 index.php에 전달하려는 것과 같은 것이있는 경우에 대비합니다 .


1
?이 index.php를해야 경로는 = $ (1)
제이 섹 Pietal

1
@Prozi하지 당신이 하위 디렉토리에있어, 경우 의 index.php 다음은 / 선도 필요는 docroot에에 -로 Options +Indexes의 index.php 에 포함 DirectoryIndex당신이 할 수 생략 할 index.php를 모두 바로 사용 /?path=$1이 때 진정한 보유 httpd-vhosts.conf <Directory>유형 지시문이 아닌 .htaccess를 통해 다시 작성 합니다.
CD001

그것을 사용하고 $ _GET [ 'path']에 의존하면 nginx 서버로 이동하는 경우 문제가 발생합니다 ...
barell

3
좋은 게시물! 사용자가 URL에 $_GET['path']추가하면 덮어 쓸 수 있다는 점은 주목할 가치가 있습니다 path=whatever.
rybo111

1
@Liviuge-사실이지만 처음에는 전체 경로를 통과 $_GET했으므로 필요했을 것입니다 (.*)... 재밌지 만 6 년 전에 OP가 사용했던 RewriteRule은 그 당시에는 작동하지 않았지만 MVC 아키텍처는 PHP로 진화했습니다. ( 업데이트 된 2 월 18 일 비트에 넣은 것처럼 ) 이제는 ... 그들이 시간보다 앞서 있다고 생각합니다 :) /mvc/물론 디렉토리에 대한 올바른 경로가 필요합니다 .
CD001 19.01.28

28

존재하지 않는 모든 것을로 리디렉션하려면 지시문 index.php을 사용할 수도 있습니다.FallBackResource

FallbackResource /index.php

그것은으로 동일하게 작동 ErrorDocument하면, 서버에 forwords 자동으로 지시자에 대한 요청을 존재하지 않는 경로 또는 파일을 요청할 때, index.php.

당신은 모든 것을 (리디렉션 할 경우 including existant files or folders에) index.php, 당신은 다음과 같은 것을 사용할 수 있습니다 :

RewriteEngine on

RewriteRule ^((?!index\.php).+)$ /index.php [L]

패턴 ^((?!index\.php).+)$index.php무한 루프 오류를 방지하기 위해 대상 경로를 제외한 모든 uri와 일치합니다 .


그러나 다음을 사용할 수도 있습니다.DirectoryIndex index.php
Shao

1
루트 경로 자체도 리디렉션하려는 경우 패턴 *대신 사용하십시오 +.
Mir-Ismaili

15

다음과 같이 사용할 수 있습니다.

RewriteEngine on
RewriteRule ^.+$ /index.php [L]

그러면 모든 쿼리가 루트 디렉터리의 index.php로 리디렉션됩니다. 또한 이미지, 자바 스크립트 파일 또는 스타일 시트와 같이 존재하는 파일에 대한 쿼리를 리디렉션합니다.


1
이 솔루션은 거의 저에게 효과적이었습니다. "AH00124 : 요청이 10 개의 내부 리디렉션 한도를 초과했습니다."라는 메시지가 계속 표시됩니다. 전에 "RewriteRule ^ index \ .php-[L]"을 추가했는데 완벽하게 작동합니다!
Fredster

11

모든 시나리오에 맞는 이 문제에 대한 하나의 "속임수" 가 있습니다. 실제로 작동한다고 믿기 위해 시도해야 할 매우 명백한 솔루션입니다 ... :)

여기있어...

<IfModule mod_rewrite.c>

   RewriteEngine On

   RewriteCond %{REQUEST_FILENAME}  -f [OR]
   RewriteCond %{REQUEST_FILENAME} !-f
   RewriteRule ^(.*)$ index.php [L,QSA]

</IfModule>

기본적으로, 당신이 요구하는 mod_rewrite를을 에게 전달하는 index.phpURI를 요청 파일이 존재하는 경우에 항상 AND 항상 요청 된 파일이 존재하지 않을 때 !

어떻게 작동하는지 이해하기 위해 MOD-REWRITE 의 소스 코드를 조사 할 때 참조 된 파일이 존재하는지 여부를 확인한 후에 모든 검사가 항상 발생한다는 것을 깨달았습니다. 그래야만 RegEx처리됩니다. URI가 폴더를 가리키는 경우에도 Apache는 구성 파일에 나열된 색인 파일을 확인 합니다.

이 간단한 발견을 바탕으로 파일 존재 확인을 두 번 탭하고 두 결과를 동일한 엔드 포인트로 라우팅하여 가능성의 100 %를 포함하는 한 모든 가능한 호출에 대해 간단한 파일 유효성 검사만으로도 충분 합니다.

중요 : 에는 " / " 가 없습니다 index.php. 기본적으로 MOD_REWRITE 는 전달을 위해 "기본 폴더"로 설정된 폴더를 사용합니다. 이 솔루션의 장점은 사이트의 "루트 폴더"일 필요가 없기 때문에이 솔루션 localhost/이 적용되는 모든 하위 폴더에서 작동 할 수 있다는 것입니다.

궁극적으로 이전에 테스트 한 다른 솔루션 (잘 작동하는 것으로 보이는 솔루션)은 상대 경로를 통해 파일을 "요구"하는 PHP 기능을 손상 시켰습니다. 조심해.

어떤 사람들은 이것이 잘못된 해결책이라고 말할 수 있습니다. 실제로 그럴 수도 있지만 여러 시나리오, 여러 서버, 여러 Apache 버전 등에서 테스트하는 한이 솔루션은 모든 경우에 100 % 작동했습니다!


감사합니다. 이것은 FallbackResource index.php라인이 Mac (OS X 10.11)에서 작동했지만 Centos 7.5에서는 작동하지 않는 문제를 해결 했습니다. 그러나 이것은 RewriteRule예를 들어 CSS 파일의 위치도 다시 작성합니다. PHP 파일 만 리디렉션해야했기 때문에 규칙을 RewriteRule ^(.*)php$ index.php [L,QSA]. YMMV.
Laryx Decidua

1
도움이되어 기쁩니다. 질문이 " htaccess를 사용하여 index.php로 모두 리디렉션 "이기 때문에 모든 파일을 대상으로합니다 . RewriteRule ^(.*)\.php$ index.php [L,NE,QSA](작동하는 데 조건이 필요하지 않음) 과 같이 PHP 파일 만 리디렉션하는 다른 더 우아한 방법이 있습니다. : 요즘, 그러나, 나는 더 저렴 규칙을 사용 RewriteRule ^.+$ index.php [L,NE,QSA], 조건과 결합 될 수 있습니다 RewriteCond %{REQUEST_FILENAME} !-fRewriteCond %{REQUEST_FILENAME} !-d, 또는과 RewriteCond $1 !^(index\.php|assets|robots\.txt|favicon\.ico)진정으로 특정 할 수있다.
Julio Marchi

5

어리석은 대답이지만 리디렉션되지 않는 이유를 알 수 없으면 웹 폴더에 대해 다음이 활성화되어 있는지 확인하십시오.

AllowOverride All

이렇게하면 실행 중이어야하는 htaccess를 실행할 수 있습니다! (대안이 있지만 켜지지 않으면 문제가 발생합니다 https://httpd.apache.org/docs/2.4/mod/core.html#allowoverride )


0

앵커 태그를 변경하는 것을 잊지 마세요.

예:

.htacces file
RewriteEngine On

RewriteRule ^about/$ /about.php

PHP file:
<a href="about/"> about</a>

항상 <a> 태그를 변경하는 것을 잊지 마십시오.
Collins Benson

2
어떻게합니까 (가) 가정, 태그를 변경하지 않는 일을 한 거야?
Enrico Maria De Angelis

0

디렉토리가 존재하는 경우 (핵심 프레임 워크 폴더 및 파일의 경우) 모든 요청을 프레임 워크 인덱스 핸들러로 리디렉션하는 방법을 궁금해하는 경우 몇 가지 오류 / 성공 시도가 방금 .htaccess에서 RewriteCond를 변경해야한다는 것을 알게 된 후 파일

RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d

위의 조건은 "파일을 찾을 수 없음"및 "디렉토리를 찾을 수 없음"을 나타냅니다. 좋아요. "찾을 수 없음"(! -d) 줄을 제거하고 다음과 같이 종료하면 어떨까요?

RewriteEngine on
RewriteBase /framework/
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^(.*)$ /framework/index.php [L,QSA]

나에게 매력처럼 일 했어

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