Como impedir que o Apache encontre um nome de arquivo a partir de um caminho de URL (sem a extensão)

1

Eu tenho um arquivo update.php no meu documento raiz.

Mas eu não quero que /update no meu URL seja direcionado para update.php (porque eu quero que /update seja associado a uma página no meu CMS, Drupal 7)

Eu sei que o Apache está "processando" /update antes que o Drupal consiga vê-lo: Eu criei uma nova pasta vazia test.dev no meu dev local coloquei um arquivo nele chamado orange.html e meu navegador visitou test.dev / orange - que mostrava orange.html - então é um caso de configuração do Apache

Minha configuração é de puphpet.com Ubuntu12.04 PHP5.5 a maioria das configurações como padrão fornecido

 test.conf                                                                                                                                          
 # ************************************
 # Vhost template in module puppetlabs-apache
 # Managed by Puppet
 # ************************************

 <VirtualHost *:80>
   ServerName test.dev

   ## Vhost docroot
   DocumentRoot "/var/www/test.dev"



   ## Directories, there should at least be a declaration for /var/www/test.dev

   <Directory "/var/www/test.dev">
     Options Indexes FollowSymLinks MultiViews
     AllowOverride All
     Require all granted
   </Directory>

   ## Load additional static includes


   ## Logging
   ErrorLog "/var/log/apache2/test_error.log"
   ServerSignature Off
   CustomLog "/var/log/apache2/test_access.log" combined




   ## SetEnv/SetEnvIf for environment variables
   SetEnv APP_ENV dev

   ## Custom fragment


 </VirtualHost>

Como posso configurar o Apache para que o id não tente buscar um arquivo cujo nome (sem extensão) corresponda ao URL? Eu ficaria feliz em fazer isso para casos específicos para /update Eu prefiro não desligar a configuração atual no caso de quebrar coisas em outro lugar (regressão) como URLs limpas. Eu prefiro adicionar um caso específico de "exceção" para /update .

Minha configuração: Ubuntu 12.04 LTS

apache2 -v
Server version: Apache/2.4.9 (Ubuntu)
Server built:   Apr  1 2014 08:52:12

A VM foi criada com o manifesto puphpet: link

    
por therobyouknow 03.10.2014 / 10:55

2 respostas

2

A causa raiz é com a diretiva MultiViews

link

If the server receives a request for /some/dir/foo and /some/dir/foo does not exist, then the server reads the directory looking for all files named foo.*, and effectively fakes up a type map which names all those files, assigning them the same media types and content-encodings it would have if the client had asked for one of them by name. It then chooses the best match to the client's requirements, and returns that document.

No meu arquivo de conf do meu site, removi MultiViews abaixo

<Directory "/var/www/test.dev/public_html">
  Options Indexes FollowSymLinks MultiViews
  AllowOverride All
  Require all granted
</Directory>

E reiniciei o Apache

Descobri que recebi uma página 'página não encontrada' exibida no Drupal - que é exatamente o que eu quero, porque significa que o Apache não interceptou a URL. Se eu não tivesse o Drupal no site, e apenas o html, eu teria um 404. (O Drupal não é relevante aqui, é apenas o meu próprio cenário).

Portanto, a solução pode ser remover MultiViews, mas primeiro preciso verificar se não há casos em que seja necessário. O que pode ajudar a tornar esse ajuste mais específico (e, portanto, menos arriscado seria usar RemoveType para remover os arquivos .php correspondentes às URLs: link )

    
por 07.10.2014 / 11:47
0

Exibir um arquivo ou diretório com aparência semelhante em vez de gerar um erro 404 de não encontrado quando um URL inexistente é usado é um comportamento não padrão.

Pode ser o resultado da ativação do mod_speling do apache, mas é mais provável que você tenha reescrito regras em um arquivo .htaccess.

Por padrão, uma implantação do Drupal 7 inclui esse arquivo .htaccess que não parece estar fazendo algo incomum, mas ele usa o Drupal index.php como o documento de erro 404, que por sua vez pode fazer algo especial no Drupal quando uma URL corresponde ao nome do arquivo sem a extensão .html.

    
por 03.10.2014 / 14:13