모든 URL을 단일 PHP 파일을 통해 실행하려면 어떻게해야합니까?


9

URL이 이러한 형식 인 MVC 시스템은 단일 index.php 파일을 통해 모든 요청을 어떻게 적용합니까?

http://www.example.com/foo/bar/baz
http://www.example.com/goo/car/caz/SEO-friendly-name-of-the-object
http://www.example.com/hey/you

편집 : 아래의 다시 쓰기 규칙을 시도하면이 오류가 발생합니다.

[error] [client 127.0.0.1] Invalid URI in request GET / HTTP/1.1
[error] [client 127.0.0.1] Invalid URI in request GET /abc HTTP/1.1

편집 : 아, 이것은 /index.php의 완전한 내용입니다. 다시 쓰기 규칙을 제거하면 '/'또는 '/index.php'가 출력되거나 다른 항목에 대한 404가 표시됩니다.

<?php
echo htmlspecialchars($_SERVER['REQUEST_URI']);
?>

해결 : 다시 쓰기 규칙에서 index.php 앞에 /를 추가 한 다음 작동했습니다.

해결 방법 : 2.2.4를 실행했기 때문에 / 만 필요한 것으로 나타났습니다. 2.2.11로 업그레이드했을 때 /는 더 이상 필요하지 않았습니다.


어떤 규칙 집합을 사용 했습니까? 둘 다 시도했지만 모두 잘 작동합니다. mod_rewrite가 활성화 되었습니까?
Manuel Faux

mod_rewrite가 활성화되어 있지 않으면 서버가 시작되지 않습니다. 중요한 경우 WinXP의 Apache 2.2입니다.
jmucchiello

답변:


12

Apache를 사용하는 경우 다음을 통해 다시 쓰기를 사용하십시오 mod_rewrite.

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

URL을»index.php? q = foo / bar / baz«에 투명하게 다시 씁니다.

2. 및 3. 줄은 기존 파일 또는 디렉토리를 가리키는 경우 URL을 다시 쓰지 않도록 다시 쓰기 엔진에 지시합니다. httpd 서버에서 제공 한 실제 파일에 액세스하려면 필요합니다.


위의 편집을 참조하십시오. 400 오류가 발생했습니다.
jmucchiello

서버로 보낸 정확한 요청은 무엇입니까? 서버에 mod_rewrite가 설치되어 있습니까? 그렇지 않으면 구문 오류로 인해 시작되지 않기 때문에 추측합니다.
Manuel Faux

편집은 정확한 요청 localhost : 8181localhost : 8181 / abc를 보여줍니다 . 다시 쓰기 규칙을 제거하면 index.php가 /이고 일반 404가 / abc입니다.
jmucchiello

index.php 앞에 /를 추가하고 문제를 해결했습니다.
jmucchiello

신비한 ... 나는 슬래시없이 테스트했고 그것은 아파치 -2.2.11-8과 함께 나를 위해 일했습니다.
Manuel Faux

1

아래 코드는 Apache의 mod_rewrite를 사용하여 index.php에 매핑 할 실제 파일이나 디렉토리를 가리 키지 않는 모든 URL을 다시 씁니다. 최종 결과는 다음과 같습니다.

http://www.example.com/index.php/foo/bar/baz
http://www.example.com/index.php/goo/car/caz/SEO-friendly-name-of-the-object
http://www.example.com/index.php/hey/you

다시 쓰기 규칙 :

RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)$ index.php/$1 [PT,L,QSA]

설명:

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

위의 두 줄은이 규칙이 일반 파일 (-f) 또는 디렉토리 (-d)에는 적용되지 않음을 나타냅니다.

RewriteRule ^(.*)$ index.php/$1 [PT,L,QSA]

mod_rewrite 규칙 작성 방법에 대한 자세한 정보는 Apache 웹 사이트 ( http://httpd.apache.org/docs/2.2/mod/mod_rewrite.html) 에서 수집 할 수 있습니다 .


위의 편집을 참조하십시오. 400 오류가 발생했습니다.
jmucchiello

두 답변을 모두 올바른 것으로 설정할 수 있기를 바랍니다.
jmucchiello
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.