Apache - 동적 하위 폴더

Apache - 동적 하위 폴더

YouTube에서 폴더를 동적으로 만드는 방법은 무엇입니까? 예를 들어 다음과 같이 루트 디렉터리의 사용자 채널에 액세스할 수 있습니다.

http://youtube.com/PewDiePie

각 채널에 대해 새 폴더를 만드는 것은 분명히 그들의 접근 방식이 아니며 다음 링크도 있습니다.

http://youtube.com/PewDiePie/about

이 작업은 htaccess, Apache를 사용하여 수행됩니까, 아니면 PHP를 사용하여 수행됩니까? StackOverflow에 문의해야 합니까?

답변1

이를 URL 재작성이라고 합니다. Apache 구성에서 직접 RewriteEngine을 사용하거나 .htaccess를 사용하여 Apache에서 이 작업을 수행할 수 있습니다(실제로 차이는 없습니다). 다른 많은 웹 서버에서 이 작업을 수행할 수 있습니다(저는 성능과 구성 용이성 때문에 nginx를 좋아합니다).

URL을 다시 작성할 때 URL의 동적 부분(예에서는 / 뒤와 두 번째 / 앞의 모든 항목이 동적 부분 중 하나임)을 일부 서버 측 언어로 전달되는 변수에 할당합니다. PHP를 사용하든 JSP를 사용하든 상관없습니다). 그런 다음 서버 측 언어에서 이는 일반 GET 매개변수이며 이를 조작할 수 있습니다. 데이터베이스에서 관련 데이터를 읽는 등의 작업을 할 수 있습니다.

예를 들어 다음과 같이 다시 작성합니다.

^(.*)/(.*)$ /controller.php?user=$1&page=$2

그런 다음 PHP에서 코드는 다음과 같습니다.

echo $_GET['user'];

다음을 인쇄합니다:

PewDiePie

답변2

이는 시스템의 실제 물리적 디렉터리가 아닙니다. 이는 물리적 디렉토리에 매핑되거나 함수 또는 애플리케이션에 대한 매개변수로 해석되어 조작될 수 있는 URL 네임스페이스의 동적 이름입니다.

이러한 "마법"을 촉진하는 것은 종종 URL 재작성입니다. 정말 궁금하다면 scraping 매거진의 다음 튜토리얼을 살펴보세요.URL 재작성 소개.

당신이 위키피디아라고 상상해 보세요. 전체 웹사이트는 주로 PHP를 기반으로 하므로 실제 URL은 다음과 같습니다.

http://en.wikipedia.org/w/index.php?title=Barack_obama

그런데 홈페이지에 접속하시면 아래와 같은 페이지를 보실 수 있습니다.

http://en.wikipedia.org/wiki/Barack_obama

이를 달성하기 위한 Apache 구성:

RewriteEngine On
#Look for the word "wiki" followed by a slash, and then the article title
RewriteRule   ^wiki/(.+)$   w/index.php?title=$1   [L]

이를 위해서는 브라우저가 액세스하는 URL이 필요합니다."http://en.wikipedia.org/wiki/Barack_obama"그리고 웹 서버(Apache) 내부에서 다시 작성하세요."http://en.wikipedia.org/w/index.php?title=Barack_obama".

나는 종종 이것이 스타트렉의 만능번역기와 비슷하다고 생각한다. 서버는 입력 시 브라우저에서 일련의 URL을 취하고 백엔드에서는 이러한 URL을 서버 또는 다른 서버의 실제 애플리케이션 및 스크립트에 매핑되는 다른 URL로 변환합니다.

답변3

없이 모두 리디렉션하려면 /간단한 AliasMatch를 사용하여 다음을 달성할 수 있습니다.모듈 별칭):

AliasMatch ^/([^/]+) /path/to/handler.php

REQUEST_URI그런 다음 스크립트에서 환경 변수를 확인하여 표시할 사용자를 처리할 수 있습니다 .

/about그런 다음 처리 와 같은 추가 작업이 있습니다 .

AliasMatch ^/([^/]+)/(about|videos|blah) /path/to/handler.php

/x/y/z또는 위의 사용자 부분( [^/]+슬래시가 아닌 하나 이상의 문자) 과 일치한 것처럼 두 수준만 일치하도록 할 수 있습니다( 유사한 경로는 처리되지 않음).

AliasMatch ^/([^/]+)/([^/]+) /path/to/handler.php

REQUEST_URI표시할 내용을 결정 하려면 다시 사용하세요 .

이렇게 하면 페이지 URL이 "있는 그대로" 제공되지만(브라우저 주소 표시줄의 URL은 동일하게 유지됨) 콘텐츠는 /path/to/handler.php.

이는 두 가지 별도의 규칙입니다. /usernameand 를 하나의 규칙으로 처리하는 방법이 있을 수 있지만 /username/something결국 읽기가 매우 어려울 수 있습니다. 이후에 오는 모든 항목과 일치하는 것을 피하기 위해 이러한 방식으로 수행됩니다 domain.com.

스크립트의 매개변수에 대한 경로를 변경해야 하는 경우 다음 위치에 있습니다 RewriteRule.모드 재작성). 주소 표시줄에 URL을 유지하려면 역방향 프록시 쿼리를 수행해야 합니다.

 RewriteEngine On
 RewriteRule ^/([^/]+) /path/to/handler.php?user=$1 [LP]
 RewriteRule ^/([^/]+)/(about|videos|blah) /path/to/handler.php?user=$1&args=$2 [LP]

이렇게 하면 스크립트 처리 시간이 절약되고 REQUEST_URIPHP에서 변수를 추출할 수 있습니다.$_GET['user']$GET['args']

마찬가지로 AliasMatch두 번째 규칙은 다음과 같습니다.

 RewriteRule ^/([^/]+)/([^/]+) /path/to/handler.php?user=$1&args=$2 [LP]

그러나 스크립트는 두 URL과 일치하는 모든 항목에 대해 무엇을 해야 하는지 알아야 합니다. 다음 URL에는 원하는 내용이 아닐 수 있습니다.

 /errors/404.html
 /about/google.html

등.

관련 정보