2013-03-15 1 views
1

두 대의 다른 서버에서 Slim 앱을 성공적으로 실행하고 AppFog에서 동일한 구조를 사용하여 설정했지만 정상적으로 실행되지 않았습니다.Slim Framework에서 AppFog에서 실행되는 라우팅 문제

내 디렉토리 구조로 시작합니다 :

.htaccess 
/public 
    .htaccess 
    index.php 
    /routes 
/Slim 

루트 htaccess로 파일은 AppFog 워드 프로세서에서 DocumentRoot의 코드가 포함되어 있습니다. 내 API 코드가 갈 곳

RewriteEngine on 
RewriteCond %{HTTP_HOST} ^brs.aws.af.cm$ [NC,OR] 
RewriteCond %{HTTP_HOST} ^www.brs.aws.af.cm$ 
RewriteCond %{REQUEST_URI} !public/ 
RewriteRule (.*) /public/$1 [L] 

/공공 디렉토리이며, 슬림 index.php를htaccess로 파일은 현재입니다. 서버가 http://brs.aws.af.cm/에 설치하고 나는 아래의 주요 경로를 나열했습니다

require '../Slim/Slim.php'; 

\Slim\Slim::registerAutoloader(); 

$app = new \Slim\Slim(); 


// Default GET route 
$app->get('/', function() { 
    echo "Default GET route"; 
}); 


// Hello World route 
$app->get('/hello/:name', function ($name) { 
    echo "Hello, $name"; 
}); 


$app->run(); 

: :이 의 index.php 파일은 두 가지 간단한 경로를 포함

  1. /=> 기본 GET 경로를 사용
  2. /인사/존 => 404 오류
  3. /공공/인사/존 =이> 작동하지만, URL에 "/ 공개"필요

그리고 여기 몇 가지 이상한 점이 있습니다. 7 자 경로로 인해 404 오류가 발생하며 6 개 이하의 경로는 기본 GET 경로를 사용합니다.

  1. /123456 =>는 작동하지만 기본 GET 경로
  2. /1,234,567 => 404 오류

내가 완전히 난처한 상황에 빠진거야를 사용해서는 안된다. DocumentRoot 코드와 관련이 있다고 생각합니다. 그러나 정확히 무엇이 정확한지는 모르겠습니다. 또한 /public/.htaccess

RewriteBase /public/ 

설정을 해봤지만 아무것도에 영향을 미칠 것 같지 않습니다.

도움을 주시면 감사하겠습니다. 감사!

+0

저는 AppFog에 익숙하지 않지만 ** 루트 ** .htaccess 파일을 제거하고 공개 디렉토리의 .htaccess 파일에 포함 시키려고 시도 했습니까? 또한 공용 RewriteRule을 제거하고 index.php/$ 1에 다시 작성하십시오. – gmartellino

+0

@GaryM Thanks. 나는 당신의 제안을 시도했지만, ** 루트 ** 디렉토리는 기술적으로 웹 루트이므로, 첫 번째 .htaccess 파일이/public/디렉토리로 실제로 리다이렉트 될 필요가 있다고 생각한다. – brad

+0

AppFog에서 동일한 문제가 발생했습니다. 해결책을 찾았습니까? –

답변

1

Slim PHP 프레임 워크의 Environment.php 행 143에 버그가 있습니다. 특히 $_SERVER['SCRIPT_NAME'] 경로가 $_SERVER['REQUEST_URI'] 변수와 호환된다고 가정합니다. 대부분의 경우 이것은 아마도 사실 일 수 있지만 MOD_REWRITE를 사용하여 중간 디렉토리를 숨길 때 (인용 한 .htaccess 에서처럼) 그렇지 않습니다.

$_SERVER['SCRIPT_NAME']은 "/ public/something ..."과 유사하지만 (숨김이므로) $_SERVER['REQUEST_URI']은 "/ something ..."처럼 보입니다.

Slim은 요청 URI가 스크립트 이름을 기반으로한다고 가정합니다. 여기서는 그렇지 않습니다. 슬림 한 저자에게 버그를 알리려고 계획하고 있지만 여기에도 메모를 남기고 싶었습니다.

슬림/환경을 수정하여이 문제를 수정/해결할 수 있습니다.PHP 라인 143이 :

if (strpos($_SERVER['REQUEST_URI'], $_SERVER['SCRIPT_NAME']) === 0) { 
    $env['SCRIPT_NAME'] = $_SERVER['SCRIPT_NAME']; //Without URL rewrite 
    $env['PATH_INFO'] = substr_replace($_SERVER['REQUEST_URI'], '', 0, strlen($env['SCRIPT_NAME'])); 
} else { 
    $env['SCRIPT_NAME'] = str_replace('\\', '/', dirname($_SERVER['SCRIPT_NAME'])); //With URL rewrite 
    $env['PATH_INFO'] = $_SERVER['REQUEST_URI']; 
} 
// $env['PATH_INFO'] = substr_replace($_SERVER['REQUEST_URI'], '', 0, strlen($env['SCRIPT_NAME'])); 

적어도 내 경우에는 잘 작동하는 것 같습니다. 나는 의도 uri에서 경로를 제거하는 것이라고 생각하지만, 그것을하는 아주 끔찍한 방법이 보인다. 작업을 계속하기 위해 하위 디렉토리가 필요한 경우 좀 더 생각해야 할 수도 있습니다. :)

+0

참고로 다른 누군가가 이미이 문제를보고 한 것 같습니다 : https://github.com/codeguy/Slim/issues/521 – devios1

+0

정말 감사합니다. 당신은 내가 github에 추가 한 몇 가지 엣지 케이스를 다루지는 않지만 사소한 것입니다 (public이지만 index.php가 아닌 경우 또는 그 반대로). – user1616353

+0

그 해결책은 나를 위해 작동하지 않습니다, 나는이 해킹을 사용하고 있지만 더 좋은 방법이 있어야한다고 생각합니다 : http://help.slimframework.com/discussions/problems/5954-no-way-to-make -slim-a-subdir # comment_30893749 –