2010-02-02 4 views
1

온 : 웹 루트 외부의 디렉토리에mod_rewrite를 - 나는 URL에서 디렉토리의 숫자를 매핑 할 404

www.example.com/manual 
www.example.com/login 

.

내 웹 루트가

/www/htdocs/customername/site 

mod_alias가에서

/www/customer/some_other_dir/manual 

에서 I가 리디렉션 할 설명서입니다,이

Alias /manual /www/customer/some_other_dir/manual 

에 동일하지만 가지고있는 것 .htaccess에만 액세스 할 수 있으므로 별칭을 사용할 수 없으므로 mod_rewrite을 사용해야합니다.

RewriteRule ^manual(/(.*))?$ /www/htdocs/customername/manual/$2 [L] 

이 요청을 인식하고 적절하게 리디렉션 의미에서 작동하지만이처럼 보이는 (404)를 얻을 수는 (절대 경로를 참고 : 나는 this question 후 지금 가지고 무엇

는 다음과) :

The requested URL /www/htdocs/customername/manual/resourcename.htm 
was not found on this server. 

는 그러나, 나는 PHP로 확인했다 : echo file_exists(...) 해당 파일은 분명히 존재한다.

왜 이렇게 될까요? mod_rewrite 문서에 따르면 .htaccess 파일에서도 가능합니다. .htaccess에서 mod_rewrite를 할 때, 자동화 된 접두어가있을 것이지만, 절대 경로가 아니라는 것을 이해합니다.

웹 루트에는 없지만 기본 FTP 계정 인 한 명의 사용자 만 액세스 할 수있는 FTP 트리 내에 있습니다.

언제든지 제어판에서 웹 루트를 변경할 수 있지만 설명 된대로 작동합니다.

이것은 공유 호스팅이므로 오류 로그에 액세스 할 수 없습니다.

방금 ​​확인한 바는 잘못된 301 리디렉션이 아니며 내부 재 작성입니다.

+0

버전이 무엇입니까? (미안, 언급했다면 나는 그 질문에 어떤 버전도 쓸 수 없었다) – ziya

+0

실제로 좋은 질문이다. 나는 그것이 2.0이라고 생각한다. 그러나 나는 점검해야 할 것이다. –

+0

대상 부분이 절대 경로가 아니라고 생각하는 URL http://www.foo.com/www/htdocs/customername ...을 다시 작성해야합니다. –

답변

2

AFAIK mod_rewrite는 '프로토콜'수준에서 작동합니다 (HTTP에서의 의미). 그래서 나는 당신이 그 위치에있는 당신의 디렉토리 경로로 HTTP 302를 얻고 있다고 의심한다.

그래서 나는 당신이 호스팅하지 않는 한 당신이 붙어있을지도 모른다는 것을 두려워합니다. 따라서 현재 문서 루트 아래에서 쉘 액세스 권한이 있거나 FTP 또는 제어판을 사용하여 해당 위치에 연결할 수 있습니다.

편집 : 실제로 URL-file phase hook in the docs 그래서 지금은 directory directives 충분한 권한을 허용하지 않는 것으로 의심 언급하고있다.

+0

아니, mod_rewrite는 보통 리다이렉트 레벨에서만 작동한다. 'http : //'접두어 붙인 URL 또는'[R]'플래그. 좋은 지적이지만 재 작성 대신 리디렉션을 잘못하고 있는지 확인해 보겠습니다. –

+0

아니요, 리디렉션이없는 것 같습니다. 내부 재 작성입니다. –

+0

네, 죄송합니다. 당신 말이 맞아요. 그것은 내부입니다. 하지만 여전히 mod_rewrite는 'URL'수준에서만 작동한다고 생각합니다. – ziya

-1

이것은 사용자에게 알아야 할 사항을 알려줍니다. 요청한 URL /www/htdocs/customername/manual/resourcename.htm 이 서버에서 발견되지 않았습니다. RewriteRule ^manual(/(.*))?$ /www/htdocs/customername/manual/$2 [L]은 example.com/www/htdocs/customername/manual/ 인 것처럼 example.com/manual/을 다시 작성하는 것을 의미합니다.

대신

RewriteRule ^manual(/(.*))?$ /customername/manual/$2 [L] 

보십시오.

+0

이 문제는 리디렉션하려는 디렉토리가 웹 루트 외부에 있으므로 상대적으로 참조 할 수 없습니다. 내가'/ www/htdocs/customername/site'에 있다고 가정 해 봅시다. 이것이 웹 루트입니다. 이 문제가 발생하면 암시적인 디렉터리 접두사가 사용되지 않도록이 동작을 어떻게 변경할 수 있습니까? –

2

.htaccess에서 wwwroot 외부 파일로 다시 쓸 수 없습니다.

설명서의 위치를 ​​가리키는 웹 루트 내에 기호 링크가 있어야합니다. 조금 더 맹목적으로 그런

Options +FollowSymlinks 

당신이 사이트에서 매뉴얼이

RewriteRule ^manual(/(.*))?$ /www/htdocs/customername/site/manual/$2 [L] 

입니다 수있는 어쩌면

Options +SymLinksIfOwnerMatch 

나 :

그런 다음 당신의 .htaccess에 당신은 라인이 필요/www/customer/some_other_dir/manual

에 대한 링크

당신은 명령 행에 심볼릭 링크를 만듭니다

ln -s /www/htdocs/customername/site/manual /www/customer/some_other_dir/manual 

하지만 난 당신이 공유 쉘 접근하지 않고 호스팅에있어 상상, 그래서의 cPanel, Webmin은, 또는 무엇이든 관리 인터페이스는 내 기호 링크를 작성하는 조사. PHP/CGI 스크립트도 있습니다. 물론 호스트가 제공 한 권한 만 사용할 수 있습니다. symlink를 정책으로 따를 수 없다면 .htaccess 내의 심볼릭 링크를 재정의 할 수 없습니다.

관련 문제