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

저는 간단한 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]



답변

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

먼저 .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에 전달하려는 것과 같은 것이있는 경우에 대비합니다 .


답변

존재하지 않는 모든 것을로 리디렉션하려면 지시문 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와 일치합니다 .


답변

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

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

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


답변

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

여기있어…

<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 % 작동했습니다!


답변

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

AllowOverride All

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


답변

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

예:

.htacces file
RewriteEngine On

RewriteRule ^about/$ /about.php

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


답변

디렉토리가 존재하는 경우 (핵심 프레임 워크 폴더 및 파일의 경우) 모든 요청을 프레임 워크 인덱스 핸들러로 리디렉션하는 방법을 궁금해하는 경우 몇 가지 오류 / 성공 시도가 방금 .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]

나에게 매력처럼 일 했어