2011-10-07 5 views
4

내 웹 앱 학습을 위해 자체 MVC 프레임 워크에서 작업하고 있지만 정적 리소스를 처리하는 데 문제가 있습니다. 응용 프로그램, 일명 프론트 컨트롤러에 단일 엔트리 포인트를 갖기 위해 노력하고 있습니다. 프로젝트/모든 .htaccess가 index.php에 요청 URI를 전달하는 app/folder에 모든 요청을 리디렉션하는 .htaccess 파일이 있습니다. (app /에서는) 요청을 적절한 컨트롤러에 위임합니다.아파치가 정적 콘텐츠를 올바르게 제공하지 않음

그러나 javascript 나 계단식 스타일 시트와 같은 정적 인 콘텐츠를 제공하려고 할 때 app/index.php를 통해 여전히 리디렉션됩니다. 또한 /var/log/apache2/errors.log에 "favicon.ico가/var/www에 존재하지 않습니다."라는 오류가 발생합니다 (~/www에 대한 심볼릭 링크 때문일 수도 있습니다). 나는 때문에 내 프로젝트 루트의 루트 디렉토리에 다음의 .htaccess 파일에 기대하지 않는다 '

<IfModule mod_rewrite.c> 
    RewriteEngine On 

    # ensure request is not path to filename or directory 
    RewriteCond %{REQUEST_FILENAME} !-f 
    RewriteCond %{REQUEST_FILENAME} !-d 

    # redirect all requests to index.php?url=PATHNAME 
    RewriteRule ^(.*)$ index.php?url=$1 [QSA,L] 
</IfModule> 

왜 수 있습니다 : 여기

<IfModule mod_rewrite.c> 
    Options -Indexes +FollowSymLinks 
    RewriteEngine On 

    RewriteBase/

    # ---------------------------------------------------------------------- 
    # Suppress the "www." at the beginning of URLs 
    # ---------------------------------------------------------------------- 
    # The same content should never be available under two different URLs - especially not with and 
    # without "www." at the beginning, since this can cause SEO problems (duplicate content). 
    # That's why you should choose one of the alternatives and redirect the other one. 
    RewriteCond %{HTTPS} !=on 
    RewriteCond %{HTTP_HOST} ^www\.(.+)$ [NC] 
    RewriteRule^http://%1%{REQUEST_URI} [R=301,L] 

    #---------------------------------------------------------------------- 
    # Route static resources to respective files 
    #---------------------------------------------------------------------- 
    RewriteCond %{REQUEST_FILENAME} !-f 
    RewriteCond public/$0 -f 
    RewriteRule ^.+\.(jpg|gif|png|ico|css|js)$ /public/$0 [L] 

    #---------------------------------------------------------------------- 
    # Redirect all other requests to the app folder 
    #---------------------------------------------------------------------- 
    RewriteRule ^$ app/ [L] 
    RewriteRule (.*) app/$1 [L] 
</IfModule> 

내 응용 프로그램/폴더에 htaccess로입니다 정적 콘텐츠를 올바르게 제공합니까? 이것은 public /에 대한 모든 정적 요청을 보내려고하지 않고 있다면 css, jpg, png, js 등의 파일이있는 곳에서 나에게 의미가 있습니다. 하지만 거기에 공개 디렉토리에 이러한 파일에 대한 요청을 보내려면 RewriteCond 규칙이 ... 혼란?

다음
 
/
/.htaccess 
/app/.htaccess 
/app/index.php 
/public/static.js (for example) 

내가이 문제를 해결하기 바라고, 가지고 올 것입니다 : 루트 폴더에 htaccess로

+0

모든 파일을 필터링하지만 여전히 작동하지 않으므로'RewriteCond % {REQUEST_FILENAME}! -f'을 제거하려고 시도했습니다. – Andrew

답변

1

프로젝트 구조는 다음과 같은 것을, 내가 이해 것과, 가정 :

<IfModule mod_rewrite.c> 
    Options -Indexes +FollowSymLinks 
    RewriteEngine On 

    RewriteBase/

    RewriteCond %{HTTPS} !=on 
    RewriteCond %{HTTP_HOST} ^www\.(.+)$ [NC] 
    RewriteRule^http://%1%{REQUEST_URI} [R=301,L] 

    RewriteRule ^public/.+\.(jpg|gif|png|ico|css|js)$ - [L] 
    RewriteRule ^(.*)$ app/$1 [L] 
</IfModule> 

그리고 app 폴더의 .htaccess는 변경되지 않습니다.

공개로 시작하고 나열된 확장명을 가진 파일 인 요청은 모두 대시 문자로 리디렉션되지 않습니다. 마지막 규칙은 요청을 app/index.php 파일로 리디렉션 할 수있게합니다.

나는 결과 동작은 예상 하나라고 생각 : 공공 디렉토리에

  • 정적 파일 앱/인덱스에 을 리디렉션됩니다 public 디렉토리에있는 다른 확장자로,
  • 파일을 리디렉션되지 않습니다. PHP (어쩌면 오류 처리 용),
  • public으로 시작하지 않는 요청은 app/index.php로 리디렉션됩니다.
+0

예, 이것은 꽤 많이 내 디렉토리 구조의 관점에서 무엇을 달성하려고 노력하고있어. 고맙습니다! 나는 그것을 몇 가지로 시험해보고 결과를 게시 할 것이다. – Andrew

+0

여전히 작동하지 않습니다. 파일에 대한 링크를 지정하면 파일 대신 인덱스 페이지가 제공됩니다 (지금까지 내 유일한 동작 임). 어쩌면 RewriteCond , RewriteCond <이 확장명>, RewriteRule <공용 폴더>이어야합니다. 이것은 apache2 errors.log에 "No favicon.ico in/var/www"메시지도 없앨 수 있습니다 ... – Andrew

+0

게시 한 것을 테스트했기 때문에 이상합니다. 어쩌면 아파치 설정이나 가상 호스트를 사용할 때 문제가있을 수 있습니다. – florian

관련 문제