% 1 NÃO é um tipo de variável global para toda a configuração do Apache.
Em VirtualDocumentRoot ele corresponde à primeira parte do nome 'Host', e em RewriteCond
ou RewriteRule
representa referências anteriores aos grupos de captura no anterior RewriteCond
. Consulte o documento do Apache para RewriteCond
Jogue fora essa parte:
RewriteCond /var/www/html/%1 !-d
Seu uso de% 1 está errado, você não tem nenhum RewriteCond antes, então% 1 é uma string vazia. Então basicamente você tem uma condição que diz "Se / var / www / html / não é um diretório, faça ..."
Mas obviamente /var/www/html
é um diretório, é por isso que sua linha de registro diz
RewriteCond: input='/var/www/html/' pattern='!-d' => not-matched
UPADTE como seguimento do seu comentário:
A coisa a entender é que o Apache é feito de várias partes diferentes que são os módulos. Cada módulo vem com sua própria sintaxe. Isso torna o todo muito poderoso, mas pode ser confuso, como na sua pergunta. Cada módulo poderia definir uma sintaxe com uma variável chamada %1
representando alguma outra coisa em cada módulo.
Pode ser que agora eu tenha entendido melhor o que você quer fazer:
- Verifique se uma solicitação tem um diretório correspondente ao seu subdomínio. Caso contrário, envie para
/var/www/html/nosubdomain.php
- Senão verifique se a solicitação corresponde a um arquivo / diretório / link, se não, envie para
/var/www/html/nofile.php
Etapa 1: obtenha o subdomínio
Para obter o subdomínio, você pode usar a habilidade de mod_rewrite para definir e definir variáveis de ambiente (aqui o %1
é o resultado da captura em RewriteCond):
# Setting environment variable SUBDOMAIN = (subdomain).example.com
RewriteCond %{HTTP_HOST} ^([^\.]*)\.example\.com$
RewriteRule . - [E=SUBDOMAIN:%1]
Passo 2: Agora você pode usar a variável SUBDOMAIN em suas regras de reescrita / cond e verificar se o diretório correspondente ao subdomínio existe. Se não você redirecionar para a página definida
# Test if subdomain directory exists, if not, redirect to a
# standard page (/var/www/html/nosubdomain.php).
RewriteCond /var/www/html/%{ENV:SUBDOMAIN} !-d
RewriteRule .* /var/www/html/nosubdomain.php [L]
Etapa 3: verifique se existe um arquivo solicitado, se não, envie uma página padrão ( /var/www/html/nofile.php
). Para isso, é muito melhor confiar no próprio Apache para verificar e usar um ErrorDocument. Precisamos de um Alias porque você deseja que o arquivo nofile.php
esteja fora do VirtualDocumentRoot ( /var/www/html/subdomain/
)
Alias /nofile.php /var/www/html/nofile.php
ErrorDocument 404 /nofile.php
Colocando todas essas etapas juntas logo após a sua diretiva RewriteEngine On
lhe trazer uma configuração de trabalho, é claro que você terá que se adaptar ao seu caso de uso exato. Eu testei essa configuração, ela funciona como eu queria, mas em um Apache 2.2.
Você também pode combinar as etapas 1 e 2 juntas se não usar SUBDOMAIN em outro lugar:
RewriteCond %{HTTP_HOST} ^([^\.]*)\.example\.com$
RewriteCond /var/www/html/%1 !-d
RewriteRule .* /var/www/html/nosubdomain.php [L]