2009-07-08 7 views
1

양해 해 주셔서 감사합니다. 나는 완전히 나의 개정에서 길게되기 때문에 질문을 완전히 다시 말하고있다.
index.php를
인덱스 ajax.php
관리/index.php에
관리/인덱스 ajax.phpURL 다시 쓰기 도움말

: 루트에서

: 나는 4 진입 점과 PHP MVC 프레임 워크를

요청을 받고 URL을 기반으로 해당 파일에 다시 쓰는 .htcaccess 파일이 필요했습니다. 긴 url은 index.php? rt = cms/view/15이고 index/cms/view/15가되고 싶었습니다. 그 부분은 하나의 잡기를 제외하고는 거의 완료되었습니다.

여기 지금 내 htaccess로 파일입니다 : 나는 두 개의 폴더와 간단한 사이트를 만든

# htaccess file for framework - GOOD 
Options +FollowSymLinks 

# Turn on the mod_rewrite engine - GOOD 
RewriteEngine On 

# Hide indexes - GOOD 
Options -Indexes 

# If a file is not one of these, continue processing. - GOOD 
RewriteRule \.(css|js|jpg|jpeg|png|gif|ico)$ - [L] 

# RewriteRules for folder index files 
#RewriteRule ^(index)?(.php)?$ index.php [L] - GOOD 
#RewriteRule ^admin(/?)(index)?(.php)?$ admin/index.php [L] - GOOD 

# RewriteRules for admin folder arguements - going from more specific to less 
RewriteRule ^admin/ajax/[A-Za-z0-9-_/]*$ admin/index-ajax.php?rt=$1 [L] 
RewriteRule ^admin/[A-Za-z0-9-_/]*$ admin/index.php?rt=$1 [L] 

# RewriteRule for root ajax file 
RewriteRule ^ajax/[A-Za-z0-9-_/]*$ index-ajax.php?rt=$1 [L] 

# RewriteRule for root file - by here, it is not ajax or admin related, so only 
# possible option left if the root index file 
RewriteRule ^[A-Za-z0-9-_/]*$ index.php?rt=$1 [L] 

- '루트'와 '루트/관리자', 그 각각의 내부 CSS, 이미지, 및 일부 더미 콘텐츠와 자바 스크립트 폴더. 'root'와 'root/admin'안에 index.php와 index-ajax.php 파일이 있는데, url 인수가 무엇이든 간단히 출력하고 각 폴더의 css, js, image 파일을 사용합니다.

내가 지금 가지고있는 문제는 색인/ㅋ 또는/관리/색인/ㅋ와 같은 URL을 작성하면 페이지가 올바르게 표시되고 인수가 옳다는 것입니다. 그러나, 내가/index/blah/view/admin/index/blah/view와 같은 url을 할 때 arguement는 맞지만 (? rt = blah/view) css/js/images 파일이 인덱스로 이동하기 때문에 페이지가 잘못 표시됩니다./blah/[css] 대신 index/[css]를 사용합니다.

처리 방법에 대한 아이디어가 있으십니까? 나는 css/js/image 파일을 .htaccess를 통해 통과하도록 허용 했으므로 거기에는 작업이 적을 것이다.

답변

0

당신은 HTML에서 상대 URL을 사용하고 있기 때문에 이미지/CSS/등 휴식, 그리고 지금 당신이 거라고는 그들이 더 중첩 : 당신은 재 작성 프로세스를 종료 앞에 규칙을 원하는 다시 깨는거야? 내가 만난 다른 MVC 설정에는 일반적으로 요청 URL을 기반으로 컨트롤러가 설정 한 일종의 "루트 경로"변수가 있으며 View 구성 요소가 이미지/스타일/스크립트와 같은 모든 경로 앞에 애셋을 접두어로 사용합니다.

그게 .htaccess 문제를 컨트롤러/PHP 문제로 바꿉니다. Controller/PHP 문제로 받아 들일 수있는 솔루션이라면 컨트롤러가 "/"에 요청 URL을 폭발시키고 결과 조각 수를 세는 것과 같은 일을합니다. 결과에서 상대 URL을 생성합니다.

내가 한 사용자 지정 MVC 설정에서 비슷한 작업을 수행했습니다. http://avogadro.ws/hosted/skel/public/results/school-1을 확인하고 CSS 위치의 헤드 소스를 확인하십시오. 해당 페이지의 CSS는 실제로 컨트롤러가 상대 문자열로 빌드하는 http://avogadro.ws/hosted/skel/ 수준에 있습니다.

+0

예. html의 image/css/js/etc 파일 링크는 해당 문서와 관련이 있습니다. MVC의 모든 결과 (글로벌 스타일 시트, html 스켈레톤 이미지 등)가 가질 수있는 몇 가지 외부 리소스가 있습니다. 문제는 내 .htaccess에서 css, js 또는 이미지 확장명을 가진 파일 요청을 그대로 놔두고있는 것 같습니다. 이러한 리소스는 처리가 필요하지 않다고 생각하기 때문에 그대로 사용됩니다. 하지만 이제는 URL이 중첩되어 "blah"가 실제로 컨트롤러 일 때 "blah"라는 폴더에 있다고 생각하므로 URL은 존재하지 않는 폴더로 이동합니다. –

+0

당신의 image/css/js/etc 파일이 .htaccess를 우회하는 것이 좋다고 생각합니다. 위의 내 솔루션은 URL에 접두어를 추가하여 문제가 'ㅋ'폴더에 있다고 생각합니다. 위 예제에서'/ hosted/skel' 폴더가 실제로 존재합니다. 그러나'public/results /'는 그렇지 않습니다. 'school-1'페이지에서 CSS 파일을 "main.css"라고 언급하면'/ hosted/skel/public/results/main.css'을 가져 오려고합니다. 그래서 CSS 파일을 "../../main.css"로 참조하도록 HTML을 변경합니다.이 파일은 실제로/hosted/skel/main.css 파일에 저장됩니다. – MidnightLightning

2

음, 중간에 놓은 $를 제외하고는 꽤 괜찮아 보입니다. $는 정규식의 끝을 표시하므로 제대로 작동하지 않을 것이라고 생각합니다.

또한 슬래시를 벗어날 필요가 있을지 모르지만 확실하지 않습니다.

+0

분명히 빠르지 않습니다. – seth

+0

$ 표시를 왼쪽 URL의 값을 올바른 URL로 전송할 자리 표시 자라고 생각 했습니까? –

+0

그는 처음 부분에 $를 의미합니다/ – seth

0

마지막 줄 가능성이 있어야한다 :

RewriteRule ^/([A-Za-z\-_]+)/([A-Za-z\-_]+)/([A-Za-z0-9\-_]+)$ /index.php?com=$1&action=$2&val=$3 [L,R] 
9

당신은 모든 것이 index.php에 의해 처리되어야 함을 확신합니까? images/css 등과 같은 정적 파일은 어떻습니까?

관심있는 대체 방법이 있습니다. 파일이나 디렉토리로 존재하지 않는 URL을 index.php 파일로 전달한 다음 해당 URL을 구문 분석 할 수 있습니다 (예 : [domain.com]/cms/view/15는 [domain.com] /index.php/cms/view/15로 다시 작성됩니다. 이 작업을 위해 AcceptPathInfo를 On으로 설정해야합니다. htaccess로

:

RewriteEngine On 
#check url is not a valid file 
RewriteCond %{REQUEST_FILENAME} !-f 
#check url is not a valid directory 
RewriteCond %{REQUEST_FILENAME} !-d 
#rewite anything left 
RewriteRule ^(.*)$ index.php/$1 [L] 

index.php를

$path = trim($_SERVER['PATH_INFO'], '/'); 
$pathParts = explode('/', $path); 

if (isset($pathParts[0])) { 
    $com = $pathParts[0]; 
} else { 
    $com = 'defaultcom'; 
} 

//$com[1] will be 'view' if supplied 
//$com[2] will be 15 if supplied 

난 당신이 정의하고 아파치 구성에서 URL을 이해하도록 강요하지 않기 때문에이 방법을 좋아하지만, PHP에서 대부분의 작업을 수행 할 수 있습니다.

편집하는 것은

당신 대신 당신의 .htaccess로 사용할 수이 아닌 PHP 스크립트 목록에서 확장자를 가진 모든 요청을 리디렉션합니다. RewriteCond는 admin 폴더에 대한 요청을 다시 작성하지 못하게해야합니다.

RewriteEngine On 
#don't rewrite admin 
RewriteCond %{REQUEST_URI} ^admin/ 
#rewrite anything with a file extension not in the list 
RewriteRule !\.(js|gif|jpg|png|css|ico)$ /index.php [L] 
+0

이미지와 CSS는 PHP로 처리 할 수도 있습니다.나는 아파치를 재구성하여 확실히 바보스럽고 확실히 할 수있다. (당신이 할 수도,하지 못할 수도있다.) 정적 파일 (static_files)에서 제공되는 파일에 만기 헤더를 추가하는'static.php' 파일을 넣는다. /'. –

+0

고맙습니다. 이미지 나 CSS 등은 생각 해보지 않았습니다. 사용자가 최종 HTML 출력을 위해 파일에 직접 액세스해야합니다 - 정확합니까? 그러나 사용자가 PHP 파일에 액세스 할 수 없도록하고 싶습니다. 즉, index.php를 제외한 다른 모든 PHP 파일을 실행할 필요가 없습니다. 다른 모든 PHP 파일은 프레임 워크에서 사용되며 어쨌든 컨텍스트가 부족한 경우 작동합니다. –

+0

다시 한번 감사드립니다. 목록에없는 내용을 다시 쓰려면 다음 재 작성 규칙으로 계속 진행하면됩니까? 따라서 파일이 목록에 없으면 다음 재 작성 규칙으로 계속 진행하면 index.php url을 다시 작성합니다. –

3

나는 그것을 like Tom Haigh said을하고 PHP로 요청 된 URL 경로 구문 분석 :

// extract the URL path 
$_SERVER['REQUEST_URI_PATH'] = parse_url($_SERVER['REQUEST_URI'], PHP_URL_PATH); 
// extract the path segments 
$segments = explode('/', trim($_SERVER['REQUEST_URI_PATH'], '/')); 
// expected parameters and its default values 
$params = array(
    'com' => 'default', 
    'action' => 'default', 
    'val' => 'default' 
); 
foreach ($params as $key => $val) { 
    if (isset($segments[0])) { 
     $_GET[rawurldecode($key)] = rawurldecode(array_shift($segments)); 
    } else { 
     break; 
    } 
} 
$restOfTheURLPath = implode('/', $segments); 
var_dump($_GET); 

그리고 mod_rewrite는 규칙 :에 대한 응답에서

# redirect every request, that cannot be mapped to an existing file, to index.php 
RewriteCond %{REQUEST_FILENAME} !-f 
RewriteRule ^admin(/|$) admin/index.php [L] 
RewriteCond %{REQUEST_FILENAME} !-f 
RewriteRule^index.php [L] 

편집 당신의 댓글 및 편집 된 질문 : 디렉토리를 제외 할 수 있습니다. 그래서

RewriteRule ^(css|images)/ - [L] 
RewriteRule ^admin/index\.php$ - [L] 
RewriteRule !^index\.php$ index.php [L] 
+0

고맙습니다. 이미지 나 CSS 등은 생각 해보지 않았습니다. 사용자가 최종 HTML 출력을 위해 파일에 직접 액세스해야합니다 - 정확합니까?
그러나 사용자가 다른 PHP 파일에 액세스 할 수 없도록하려면 index.php를 제외한 다른 모든 PHP 파일을 실행할 필요가 없습니다. 다른 모든 PHP 파일은 프레임 워크에서 사용하고 원합니다. 어쨌든 컨텍스트를 다 써 버리면 작동하지 않습니다.
MVC 프레임 워크를 개발 중이므로 index.php는 URL에서 사용자 요청을 처리하는 진입 점 역할을합니다. 아니면 내 생각의 과정에서 뭔가 빠져 있습니다 (가능합니다 :). –

+0

감사합니다. 필자는 제안한 이중 접근 방식을 사용하기로 결정했습니다. GET 변수에는 경로의 다른 구성 요소를 구분하는 슬래시가 이미 포함되어있는 경로가 포함됩니다. mod_rewrite를 사용하여 공용 URL에서 "? rt ="를 없애고 PHP를 사용하여 GET 변수를 구문 분석합니다. mod_rewrite로 모든 문제를 해결하는 것보다 쉽습니다. 내 프레임 워크는 이미 GET 변수를 깨뜨리는 작업을 처리하기 때문에 mod_rewrite를 가장 빠르게 적용 할 수 있습니다. .htaccess 파일이 올바른지 확인해야합니다. –

+0

훌륭한 알고리즘! PHP의 explode가 빈 배열을 예상대로 반환하지 않을 때 비어있는 REQUEST_URI를 처리하기 위해 $ segments = array_filter (explode (...))를 수행했습니다. –

3

내가 질문을 놓치지 않았다면 (내가 질문을 편집 한 후에 피칭하고 있음), 많은 폴더가 깊은 URL에 대해 상대적 이미지/CSS 경로를 수정해야하는 것처럼 들립니다. 간단한 해결책, 상대적 이미지 경로를 사용하지 마십시오! 그냥 난 항상 당신이하는 예측할 수없는 폴더 깊이 많은 페이지에 전력을 공급 하나의 템플릿을 때 쉽게 접근 방식을 발견했습니다 .. 슬래시와

<img src="/img/logo.png" alt="something" /> 

를 이미지/CSS 링크를 시작합니다. 로컬 개발을위한 테스트 URL을 가지고 있다면 로컬 및 프로덕션 서버에서 잘 작동합니다. 리눅스/아파치 서버

에 디렉토리 및 파일 설치를 테스트 할 때

+0

나는이 접근법이 내가 과거에 가졌던 재 작성 경로 문제에서 잘 작동한다는 것을 알았다. – justinl

1
# htaccess file for framework - GOOD 
Options +FollowSymLinks 

# Turn on the mod_rewrite engine - GOOD 
RewriteEngine On 

# Hide indexes - GOOD 
Options -Indexes 

# If a file is not one of these, continue processing. - GOOD 
RewriteRule ^images/([A-Za-z0-9\-_]*)\.(css|js|jpg|jpeg|png|gif|ico))$ - 
RewriteRule ^images/admin/([A-Za-z0-9\-_]*)\.(css|js|jpg|jpeg|png|gif|ico))$ - 
RewriteRule ^admin/(([A-Za-z0-9\-_/]*)/([A-Za-z0-9\-_]*)\.(css|js|jpg|jpeg|png|gif|ico))$ admin/images/$3.$4 [L] 
RewriteRule ^(([A-Za-z0-9\-_/]*)/([A-Za-z0-9\-_]*)\.(css|js|jpg|jpeg|png|gif|ico))$ images/$3.$4 [L] 

# RewriteRules for folder index files 
#RewriteRule ^(index)?(.php)?$ index.php [L] - GOOD 
#RewriteRule ^admin(/?)(index)?(.php)?$ admin/index.php [L] - GOOD 

# RewriteRules for admin folder arguements - going from more specific to less 
RewriteRule ^admin/ajax/([A-Za-z0-9\-_/]*)$ admin/index-ajax.php?rt=$1 [L] 
RewriteRule ^admin/([A-Za-z0-9\-_/]*)$ admin/index.php?rt=$1 [L] 

# RewriteRule for root ajax file 
RewriteRule ^ajax/([A-Za-z0-9\-_/]*)$ index-ajax.php?rt=$1 [L] 

# RewriteRule for root file - by here, it is not ajax or admin related, so only 
# possible option left if the root index file 
RewriteRule ^([A-Za-z0-9\-_/]*)$ index.php?rt=$1 [L] 

위의 .htaccess 내가 당신을 무시-이미지/아약스의 이미지에 대한 요청을 재 작성으로 행 대체 작동/hello/world/images가/images로 이동하고 admin 폴더에 있다면/admin/images로 이동합니다.