Use o proxy interno do subpath para subdomínios, mas redirecione os clientes externos se eles solicitarem esse subcaminho?

2

Eu tenho um VirtualHost que gostaria de ter vários subdomínios. (Por motivos de clareza, digamos que meu domínio seja example.com e eu esteja apenas tentando começar a fazer foo.example.com funcionar, e construir a partir daí.)

A forma mais simples que encontrei para um subdomínio funcionar de forma não invasiva com o framework que eu tenho era fazer proxy para um sub-caminho via mod_rewrite. Assim, os caminhos apareceriam na barra de URL do cliente como link enquanto eles realmente seriam exibidos link sob o capô.

Eu consegui fazer isso dentro do meu arquivo de configuração do VirtualHost assim:

ServerAlias *.example.com

RewriteEngine on

RewriteCond %{HTTP_HOST} ^foo\.example\.com [NC]   # <---
RewriteCond %{REQUEST_URI} !^/foo/.*$ [NC]         # AND is implicit with above
RewriteRule ^/(.*)$ /foo/$1 [PT]

(Nota: Foi surpreendentemente difícil encontrar essa combinação específica de trabalho. Especificamente, o [PT] parecia ser necessário no RewriteRule. Eu não consegui fazê-lo funcionar com exemplos que vi em outro lugar como [L] ou tentando apenas [P]. Não mostraria nada nem entraria em loop. Também alguns navegadores pareciam armazenar em cache as páginas de resposta para os loops ruins, uma vez que recebiam uma ... uma recarga de página, depois de consertar, não mostraria trabalhar! Feedback bem-vindo - em qualquer caso, se esta parte pode ser feita melhor.)

Agora eu gostaria de fazer o que o link depende de quem perguntou. Se a solicitação veio de fora, eu gostaria que o cliente fosse permanentemente redirecionado pelo Apache para que eles obtivessem o link da URL seu navegador. Se veio internamente do mod_rewrite, eu quero que o pedido seja tratado pelo framework web ... que não tem conhecimento dos subdomínios.

É algo assim possível?

    
por HostileFork 19.10.2013 / 22:12

2 respostas

2

Parece que você está quase lá, não?

Use um RewriteCond baseado no REMOTE_ADDR, por exemplo:

#
# Provide HTTP redirect "[R]" for network-external requests
# For permanent redirects, use [R=301], but note cache concerns:
# http://getluky.net/2010/12/14/301-redirects-cannot-be-undon/
#
RewriteCond %{REMOTE_ADDR} !^10\.2\.
RewriteCond %{HTTP_HOST} ^example\.com [NC]
RewriteCond %{REQUEST_URI} ^/foo/.*$ [NC]
RewriteRule ^/foo/(.*)$ http://foo.example.com/$1 [R]

#
# Pass-Through "[PT]" to subpath URL for subdomain requests
# (Assumes that foo.example.com/foo would serve the same
# content as example.com/foo, if not for the above rule)
#
RewriteCond %{HTTP_HOST} ^foo\.example\.com [NC]
RewriteRule ^/(.*)$ /foo/$1 [PT]

O exemplo do uso de uma correspondência em REMOTE_ADDR contra endereços 10.2.xx é do link

    
por 06.11.2013 / 02:45
1

Eu suspeito que você tenha que usar o "PT" devido a ter um Alias em algum outro lugar da sua configuração. Ou um VirtualHost DocumentRoot não-direto.

De qualquer forma, isso parece funcionar nos meus testes:

<VirtualHost _default_:80>
    DocumentRoot /var/www/html
        RewriteEngine on

        RewriteCond %{HTTP_HOST} ^foo\.localhost [NC]
        RewriteCond %{REQUEST_URI} ^/foo/.*$ [NC]
        RewriteRule ^/foo/(.*)$ /$1 [R]

        RewriteCond %{HTTP_HOST} ^foo\.localhost [NC]   # <---
        RewriteCond %{REQUEST_URI} !^/foo/.*$ [NC]         # AND is implicit with above
        RewriteRule ^/(.*)$ /foo/index.php?q=$1 [PT]

</VirtualHost>

Com a seguinte saída:

$ curl -D - foo.localhost / index.php

HTTP/1.1 200 OK
Date: Wed, 06 Nov 2013 13:46:45 GMT
Server: Apache/2.2.17 (Fedora)
Vary: Host
X-Powered-By: PHP/5.3.6
Content-Length: 55
Connection: close
Content-Type: text/html; charset=UTF-8

Host: foo.localhost
URI: /index.php
Query: q=index.php

$ curl -D - foo.localhost / foo / index.php

HTTP/1.1 302 Found
Date: Wed, 06 Nov 2013 13:46:51 GMT
Server: Apache/2.2.17 (Fedora)
Location: http://foo.localhost/index.php
Content-Length: 293
Connection: close
Content-Type: text/html; charset=iso-8859-1

<!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML 2.0//EN">
<html><head>
<title>302 Found</title>
</head><body>
<h1>Found</h1>
<p>The document has moved <a href="http://foo.localhost/index.php">here</a>.</p>
<hr>
<address>Apache/2.2.17 (Fedora) Server at foo.localhost Port 80</address>
</body></html>

$ curl -D - foo.localhost / anything

HTTP/1.1 200 OK
Date: Wed, 06 Nov 2013 13:46:59 GMT
Server: Apache/2.2.17 (Fedora)
Vary: Host
X-Powered-By: PHP/5.3.6
Content-Length: 53
Connection: close
Content-Type: text/html; charset=UTF-8

Host: foo.localhost
URI: /anything
Query: q=anything

$ curl -D - foo.localhost / foo / anything

HTTP/1.1 302 Found
Date: Wed, 06 Nov 2013 13:47:04 GMT
Server: Apache/2.2.17 (Fedora)
Location: http://foo.localhost/anything
Content-Length: 292
Connection: close
Content-Type: text/html; charset=iso-8859-1

<!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML 2.0//EN">
<html><head>
<title>302 Found</title>
</head><body>
<h1>Found</h1>
<p>The document has moved <a href="http://foo.localhost/anything">here</a>.</p>
<hr>
<address>Apache/2.2.17 (Fedora) Server at foo.localhost Port 80</address>
</body></html>
    
por 06.11.2013 / 14:50