저는 간단한 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.php
URI를 요청 파일이 존재하는 경우에 항상 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]
나에게 매력처럼 일 했어