Apache - Subpastas Dinâmicas

1

Como o YouTube torna as pastas dinâmicas? Por exemplo, você pode acessar os canais das pessoas no diretório raiz, como:

http://youtube.com/PewDiePie

Criar uma nova pasta para cada canal obviamente não é como eles fazem isso, e eles também têm links como:

http://youtube.com/PewDiePie/about

Isso é feito com o htaccess, o Apache, ou é algo com o PHP que eu deveria perguntar no StackOverflow?

    
por rtainc 22.08.2013 / 01:26

3 respostas

3

É chamado de reescrita de URL. Você pode fazer isso no Apache com o RewriteEngine, seja diretamente na configuração do Apache, ou com o .htaccess (realmente não há diferença). E você pode fazer isso em muitos outros servidores da web (eu gosto do nginx pelo seu desempenho e facilidade de configuração).

Quando você reescreve a URL, você atribui as partes dinâmicas da URL (no seu exemplo, o que quer que seja depois / e antes da segunda / é uma das partes dinâmicas), para uma variável, passada para algum lado do servidor language (pode ser PHP, JSP, não importa). Em seguida, na linguagem do lado do servidor, esse é um parâmetro GET comum, que você pode processar - ler dados relevantes de um banco de dados e assim por diante.

Por exemplo, você reescreve:

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

Em seguida, no PHP, o código:

echo $_GET['user'];

imprimiria:

PewDiePie
    
por 22.08.2013 / 01:32
1

Estes não são diretórios físicos no sistema. Eles são nomes dinâmicos dentro do espaço de nomes de URL que são mapeados para um diretório físico ou são interpretados como um argumento para uma função ou aplicativo que, em seguida, age nele.

Normalmente, a regravação de URLs facilita essa "mágica". Dê uma olhada neste tutorial de esmagar a revista se você for realmente curioso, intitulado: Introduction To Reescrita de URL .

Exemplo

Digamos que você seja a wikipedia. Todo o site é basicamente baseado em PHP, então as URLs reais são algo assim:

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

Mas quando você está no site, provavelmente verá a página assim:

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

A configuração do Apache que faz isso acontecer:

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

Isso leva o URL que o navegador está acessando " link " e o reescreve internamente no servidor web (Apache) para isso, " link ".

Muitas vezes penso nisso como semelhante ao de Star Trek, onde eles tiveram o tradutor universal. O servidor está pegando um conjunto de URLs na entrada (do navegador) e na parte de trás está traduzindo essas URLs em outras que mapeiam para aplicativos e scripts reais no servidor ou até mesmo em outros servidores.

    
por 22.08.2013 / 01:30
1

Para simplesmente redirecionar todos os urls que não têm um / dentro deles, você poderia conseguir com um simples AliasMatch (de mod_alias ):

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

Você pode então examinar a variável de ambiente REQUEST_URI em seu script para processar o usuário para exibir.

E, para coisas adicionais, como /about handling:

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

ou você pode fazer com que ele corresponda a apenas dois níveis (assim, caminhos como /x/y/z não serão manipulados) da mesma forma que fizemos com a parte do usuário acima ( [^/]+ um ou mais caracteres que não são uma barra):

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

E novamente use o REQUEST_URI para descobrir o que exibir.

Isso exibirá o URL da página "no estado em que se encontra" (para que a URL permaneça a mesma em sua barra de localização no navegador), ainda que o conteúdo seja gerado por /path/to/handler.php .

Estas seriam duas regras separadas. Provavelmente haveria uma maneira de manipular apenas um /username e /username/something em uma regra, mas provavelmente acabaria ficando ilegível. Eles são feitos dessa maneira para evitar corresponder tudo depois de domain.com .

Se você precisar mudar o caminho para os argumentos para o script, então você está na terra de RewriteRule (de mod_rewrite ). Se você quiser manter o URL na barra de localização você terá que fazer uma consulta de proxy reverso:

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

Isso salvaria o script tendo que processar REQUEST_URI e pode extrair variáveis de $_GET['user'] e $GET['args'] se estiver usando PHP.

Novamente, como AliasMatch , essa segunda regra poderia ser:

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

mas note que, para ambos, o seu script terá de saber como lidar com tudo o que corresponda a dois URLs. Isso pode não ser o que você deseja para esses URLs, como:

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

e assim por diante.

    
por 22.08.2013 / 01:37