Linux Mint - Apache 2.4 .htaccess rewriteRule não funciona

1

Eu tenho um site usando o .htaccess para reescrever as regras, mas algumas não funcionam.

Este é o meu arquivo .htaccess:

RewriteEngine On
RewriteBase /
# Inicio
RewriteRule ^inicio|home|index$ index.php [QSA,L]

# Paginacion amigable
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.+)\.([0-9]+)$ $1?pag=$2 [QSA,L]

# Miniaturas
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*\/)?tdd([A-Za-z0-9_~-]*)\/(.*)$ imagen.php?param=$2&src=$1$3 [QSA,L]

#paginas
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^.*-p([0-9]+)$ interna.php?id=$1 [QSA]

#Intranet
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^.*-i([0-9]+)$ intranet.php?id=$1 [QSA]

#publicaciones
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^.*-n([0-9]+)$ publicaciones_detalle.php?id=$1 [QSA]

# Paginas sin extension
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^(.+)$ $1.php [QSA]

# sitemap
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule sitemap.xml sitemap.php [QSA]

# Buscador
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^search$ buscar.php [QSA]



# En caso de no existencia
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^.*$ 404.php [QSA]

# Paginas incluidas en el template
RewriteCond %{REQUEST_FILENAME} -f
RewriteCond %{REQUEST_FILENAME} ^.*\.php$
RewriteRule ^(.*)$ plantilla.php?uri=$1 [QSA]

Mas eu tenho um erro por exemplo quando eu acesso www.domain.com/contacto ele me lança esse erro:

Not Found

The requested URL /contacto was not found on this server.

Mas se eu alterar o URL desse www.domain.com/contacto.php , ele funciona.

Acho que essa regra da lista de baixo deve fazer o trabalho, não é?

# Paginas sin extension
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^(.+)$ $1.php [QSA]

Por que estou fazendo errado?

Estes são todos os módulos carregados para o meu Apache:

Loaded Modules:
 core_module (static)
 so_module (static)
 watchdog_module (static)
 http_module (static)
 log_config_module (static)
 logio_module (static)
 version_module (static)
 unixd_module (static)
 access_compat_module (shared)
 alias_module (shared)
 auth_basic_module (shared)
 authn_core_module (shared)
 authn_file_module (shared)
 authz_core_module (shared)
 authz_host_module (shared)
 authz_user_module (shared)
 autoindex_module (shared)
 deflate_module (shared)
 dir_module (shared)
 env_module (shared)
 filter_module (shared)
 mime_module (shared)
 mpm_prefork_module (shared)
 negotiation_module (shared)
 php7_module (shared)
 rewrite_module (shared)
 setenvif_module (shared)
 status_module (shared)

E este é o meu arquivo domain.dev.conf em /etc/apache2/sites-enabled :

<VirtualHost *:80>
    ServerAdmin [email protected]
    DocumentRoot /var/www/html/domain/
    ServerAlias www.domain.dev
    ServerName domain.dev
    ErrorLog ${APACHE_LOG_DIR}/error.log
    CustomLog ${APACHE_LOG_DIR}/access.log combined
    <Directory /var/www/html/domain>
                Options Indexes FollowSymLinks MultiViews
                AllowOverride All
                Order allow,deny
                allow from all
                RewriteEngine On
    </Directory>
</VirtualHost>

Ele estava funcionando bem no apache 2.2, mas após a atualização para 2.4 pára de funcionar.

Existe uma diferença entre o apache 2. E o 2.4 na forma de aplicar arquivos htaccess.

    
por juanpscotto 21.08.2016 / 00:07

1 resposta

1
# Paginas sin extension
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^(.+)$ $1.php [QSA]

Não é a causa do seu problema, mas a segunda diretiva RewriteCond provavelmente deve estar verificando !-d , não !-f . O mesmo vale para o bloco de regras que segue.

Você também provavelmente se beneficiaria de alguns sinalizadores L ( LAST ) nas diretivas RewriteRule para interromper a atual rodada de processamento. Também não parece que você precisa do sinalizador QSA em todas as diretivas?

# En caso de no existencia
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^.*$ 404.php [QSA]

Isso deve aparecer por último. O seguinte bloco de regras nunca será executado de outra forma. No entanto, isso deve ser controlado por uma diretiva ErrorDocument .

Options Indexes FollowSymLinks MultiViews

Tente desabilitar MultiViews - isso vai entrar em conflito com sua diretiva mod_rewrite para reescrever internamente a solicitação com uma extensão .php (que é efetivamente o que MutliViews faz). Remova isso no seu VirtualHost ou desative-o no .htaccess:

Options -MultiViews

Is there a difference between apache 2. And 2.4 in the form of applying htaccess files

Não no contexto da sua pergunta, pelo menos.

    
por 21.08.2016 / 02:24