2010-03-23 11 views
0

거의 모든 프로젝트에서 작업하고 있는데 .htaccess와 관련된 일부 문제가 발생합니다. 나는 보통 가장 쉬운 해결책을 찾아 내고 아파치, 서버 등등에 대한 지식이나 이해력이 없기 때문에두고 간다. 그러나 이번에는 내가 너희에게 물어볼 것이라고 생각했다. .htaccess mod_rewrite 문제

내 (간체) 설정에서 파일과 폴더를 수 있습니다 :

/modrewrite-test 
    .htaccess 
    /config 
    /inc 
    /lib 
    /public_html 
     .htaccess 
     /cms 
      /navigation 
       index.php 
       edit.php 
      /pages 
       index.php 
       edit.php 
     login.php 
     page.php 

은 "설정", "INC"와 "LIB"폴더는 웹 사이트의 루트에서 "숨겨진"로 의미 . 나는 "public_html"로 사용자를 리디렉션하는 루트에서 .htaccess-file을 작성하여이를 수행하려고합니다. .htacess 파일에 다음이 포함되어 있습니다.

RewriteEngine On 
RewriteRule (.*) public_html/$1 

완벽하게 작동합니다. 내 브라우저에 "http://localhost/modrewrite-test/login.php"을 입력하면 내 의도 인 public_html/login.php로 끝납니다. 그래서 이것은 잘 작동합니다. "public_html을"의 htaccess로 파일이 포함되어 있습니다

RewriteEngine On 

# Root 
RewriteRule ^$ page.php [L] 

# Login 
RewriteRule ^(admin)|(login)\/?$ login.php [L] 

# Page (if not a file/directory) 
RewriteCond %{REQUEST_FILENAME} !-d 
RewriteCond %{REQUEST_FILENAME} !-f 
RewriteRule ^(.*)$ page.php?url=$1 [L] 

첫 번째 재 작성 단지에 public_html을/page.php 내가 "http://localhost/modrewrite-test/을"에 도달하려고하면 저를 리디렉션합니다. 다음 재 작성은 로그인을 시도하는 사용자의 편의를위한 - 그들은 "http://localhost/modrewrite-test/admin을"접촉을 시도 또는 "http://localhost/modrewrite-test/login는"그들이 login.php 파일에 종료됩니다 그렇다면. 세 번째 및 마지막 다시 쓰기는 나머지 요청을 처리합니다. 내가 "http://localhost/modrewrite-test/bla/bla/bla을"에 도달하려고하면 그냥 "즐"등라는 이름의 폴더를 포함하는 대신라는 폴더 "라"를 찾는합니다 ('URL'로 GET 변수 설정)/page.php를 public_html이 저를 리디렉션합니다

이 모든 것들이 완벽하게 작동하지만 예를 들어 URL 끝에 슬래시가없이 "http://localhost/modrewrite-test/cms/navigation"에 도달하려고하면 경미한 문제가 발생합니다. 해당 페이지에 도달하려고하면 브라우저가 어떻게 든 "http://localhost/modrewrite-test/public_html/cms/navigation/"으로 리디렉션됩니다. 올바른 페이지가 표시되지만 URL이 리디렉션되고 URL에 'public_html'부분이 추가되는 이유는 무엇입니까? 원하는 동작은 URL이 그대로 유지되고 페이지 public_html/cms/navigation/index.php가 표시된다는 것입니다. 제 (간체)에서

파일과 폴더가 도움이 될 수 http://highbars.com/modrewrite-test.zip

답변

0

RewriteBase에서 찾을 수 있습니다. 으로 public_html/htaccess로이 시도 :

RewriteEngine On 
RewriteBase/
+0

아무런 변화가 없습니다. 강조하고있는 문제는 변경되지 않습니다. 또 다른 한가지는 "public_html"이라는 폴더에 "public_html"이라는 폴더가 없다면 http : // localhost/modrewrite-test/public_html/*에 접근 할 수 없어야한다는 것입니다. 간소화 된 설정). –

0

/modrewrite-test/.htaccess에 다음을 추가

            
 
             
  RewriteBase /modrewrite-test 
            
 

그냥 안전을 위해, 나는 /modrewrite-test/public_html/.htaccess에 같은 규칙을 추가 할 것입니다. 나는 RewriteBase를 항상 설정하면 미래에 많은 잠재적 문제를 예방할 수 있다는 것을 알게되었습니다. 그러나 이는 사이트의 URI 구조를 변경하는 경우 값을 업데이트해야 할 수도 있음을 의미합니다.

업데이트 :
나는이 현재 폴더 구조로 가능하다고 생각하지 않습니다. 문제는 기존 서브 디렉토리가 다시 쓰기 규칙을 실행하지 못하게한다는 것입니다.

RewriteCond %{REQUEST_FILENAME} !-d 
RewriteCond %{REQUEST_FILENAME} !-f 
그러나

기존 하위 디렉터리에서 모든 인덱스 파일을 열려고하면, 당신은 리디렉션 : 당신이 존재하지 않는 파일과 디렉토리와 함께 작업하는 동안 모든 것이 잘 작동이 두 가지 조건 덕분에 - 동작 제발 참고 .../public_html/..../modrewrite-test/cms/navigation/edit.php을 제대로 열 수 있기 때문에 폴더 URL 끝에 슬래시를 추가하는 일부 Apache 핵심 지시어로 요청을 덮어 쓰고 있다고 가정 할 수 있습니다. 각 URL에 엔딩 슬래시가 있으면 모든 것이 올바르게 작동합니다 (즉, Apache 코어 디렉토리가 URL을 "수정"할 필요가 없으므로 모든 내용이 다시 작성 규칙에 따라 다시 작성됩니다).

제안 된 해결 (사람이 조언을하지 않는 한 더 나은) :

변경 /modrewrite-test/public_html/.htaccess 다음과 같이

RewriteEngine On 
RewriteBase /modrewrite-test 

# Page (if not a file/directory) 
RewriteCond %{REQUEST_FILENAME} !-d 
RewriteCond %{REQUEST_FILENAME} !-f 
RewriteRule ^(.*)$ page.php?url=$1 [L] 

은 모든 즉, 경로 하위 폴더에서 모든 PHP 파일을 제거하고 Front Controller pattern를 사용 주 page.php 파일을 통해 요청하고 아래에서 아무 것도 위임하지 마십시오.

당신은 다음 $ _GET [ 'URL']의 내용을 기반으로 직접 주요 page.php 파일 (즉 navigation/edit.php) 개별 UI를 시작하기 위해 Factory pattern 사용할 수 있습니다 (있는지 제대로을 소독 할 수 있도록).

업데이트 # 2 :
other post on StackOverflow은 젠드 프레임 워크에서 사용하는 프로젝트 구조에 조언 - 그것은 본질적으로 제가 위에서 제시 한 방법을 보여줍니다. 젠드 프레임 워크를 사용하든 그렇지 않든 상관없이 귀중한 정보 자산입니다.

+0

이 "RewriteBase"-rule은 다른 것을 수행하지 않습니다. 나는 당신의 제안과 Yaggo 's를 시도했지만 규칙이 적용될 때와 적용되지 않을 때 결과가 동일합니다. 자신이 직접 시도하려는 경우 내 정확한 (단순화 된) 설정은 http://highbars.com/modrewrite-test.zip에 있습니다. –

+0

어제 테스트 할 때 질문에 링크 된 원본 조각을 다운로드했습니다. 나는 단지 전체 연습을 다시하고 여전히 문제가 있음을 확인할 수 있습니다. 그러나 URL 끝에 슬래시가없는 경우에만 나타납니다. 그것으로보고 ... – MicE

+0

@Orhan : 위의 내 대답을 참조하십시오 (내가 편집). 나는 당신이 달성하고 싶은 것을 어떻게 할 지 모르니 대체 솔루션을 제안했습니다. – MicE

3

끝에 "슬래시"없이 기존 디렉토리에 액세스하려고 할 때 "이상한"리디렉션과 동일한 문제가 발생했습니다. 내 리디렉션은 mod_dir 아파치 모듈로 수행되었습니다. 리디렉션을 사용하지 않으려면 DirectorySlash 지시어를 사용했습니다. 의 .htaccess에서 문자열 다음 파일을 넣어보십시오 : 새로운

DirectorySlash Off 
관련 문제