Como habilitar o mod_rewrite para o Apache 2.2

474

Eu tenho uma nova instalação do Apache 2.2 na minha máquina Vista, tudo funciona bem, exceto a reescrita de mod.

Eu descomentei

LoadModule rewrite_module modules/mod_rewrite.s

mas nenhuma das minhas regras de reescrita funciona, mesmo as simples

RewriteRule not_found %{DOCUMENT_ROOT}/index.php?page=404

Todas as regras que estou usando estão trabalhando na minha hospedagem, então elas devem ficar bem, então minha pergunta é: existe algo oculto na configuração do apache que possa bloquear a reescrita de mods?

Jakub Arnold
fonte
1
na verdade, o problema era que eu tinha um caminho errado, porque $ {DOCUMENT_ROOT} me indicou o diretório raiz que estava ok na hospedagem, mas errado no local, então o problema não era apenas o RewriteEngine On, que eu já tinha ..
Jakub Arnold
Você pode alterar a resposta aceita para esta ? O autor da resposta aceita atualmente admitiu que não é bom o suficiente.
Shadow Wizard é Ear For You
1
Como habilitar o mod_rewrite no Ubuntu 12.04 LTS (também deve funcionar no Debian) . Isso mostra a instalação E a ativação. Os tutoriais abaixo surpreendentemente não fazem :(
SliQ
3
Eu recomendo fortemente a todos que desejam habilitar as diretivas mod_rewrite nos arquivos .htacces para usar em AllowOverride FileInfovez de permitir tudo, como sugerem TODAS as respostas nesta página. É triste ver todas essas respostas seguirem a abordagem "como está tudo funciona", em vez de tentar entender as consequências da "solução" proposta. Tente entender o que você está fazendo no seu servidor e como limitar os privilégios que acabou de ceder AllowOverride All. RTFM! , é bem claro sobre o assunto.
RemyNL
1
@Black Está no arquivo de configuração do Apache chamado httpd.conf. No meu PC, ele está no diretório C: \ xampp \ apache \ conf, porque instalei o Apache com o XAMPP.
Lex Soft

Respostas:

1005

Para usar, mod_rewritevocê pode digitar o seguinte comando no terminal:

sudo a2enmod rewrite

Reinicie o apache2 depois

sudo /etc/init.d/apache2 restart

ou

sudo service apache2 restart

ou de acordo com a nova maneira unificada de controle do sistema

sudo systemctl restart apache2

Em seguida, se desejar, você pode usar o seguinte .htaccessarquivo.

<IfModule mod_rewrite.c>
    RewriteEngine On
    RewriteBase /
    RewriteCond %{REQUEST_FILENAME} !-f
    RewriteCond %{REQUEST_FILENAME} !-d
    RewriteRule . /index.php [L]
</IfModule>

O .htaccessarquivo acima (se colocado no seu DocumentRoot) redirecionará todo o tráfego para um index.phparquivo no diretórioDocumentRoot menos que ele exista.

Então, digamos que você tenha a seguinte estrutura de diretórios e httpdocs é o DocumentRoot

httpdocs/
    .htaccess
    index.php
    images/
        hello.png
    js/
        jquery.js
    css/
        style.css
includes/
    app/
        app.php

Qualquer arquivo que exista nos httpdocs será enviado ao solicitante usando o .htaccessmostrado acima; no entanto, todo o resto será redirecionado para httpdocs/index.php. Os arquivos do seu aplicativo includes/appnão estarão acessíveis.

Jonathan Mayhak
fonte
15
As idéias aqui estão corretas para uma CLI UNIX, mas os comandos funcionam apenas para distribuições Linux baseadas no Debian e não para um ambiente Windows do OP.
Jason Rikard
17
a2enmod reescreveu o trabalho
Dr. Casper Black
98
Nota adicional: você também precisa garantir que a configuração do seu site esteja AllowOverride Allem ordem para que o .htaccessarquivo seja lido.
Adam Rosenfield
2
@ Dennis você pode usar reescrita a2dismod
Jonathan Mayhak
3
como posso usar a2enmod rewriteno windows?
Naman
229

Para a minha situação, eu tinha

RewriteEngine On

no meu .htaccess , junto com o módulo sendo carregado, e não estava funcionando.

A solução para o meu problema foi editar minha entrada do vhost para inlcude

AllowOverride all

na <Directory>seção do site em questão.

Mike Wazowski
fonte
10
Na verdade, mesmo com a2enmod rewrite& RewriteEngine Onno .htaccess- a existência de AllowOverride allno arquivo VirtualHost vai impedi-lo de trabalhar - é isso que me pegou fora, alterá-lo para AllowOverride allfuncionou como um encanto :)
HeavenCore
9
iniciante aqui .. onde está o arquivo do VirtualHost?
Davidneet
3
Este é o caminho a percorrer ... Eu tinha tudo preparado, exceto por isso.
arrayown
2
A AllowOverridediretiva determina os "Tipos de diretivas permitidas nos .htaccessarquivos". Além disso, "Quando essa diretiva é definida como None, os .htaccessarquivos são completamente ignorados. Nesse caso, o servidor nem tentará ler os .htaccessarquivos no sistema de arquivos". Documentos oficiais: httpd.apache.org/docs/2.2/mod/core.html#allowoverride
John Erck
Isso foi corrigido para mim - eu tive um problema com o WordPress, que normalmente não funciona corretamente. Se você fizer isso a2enmod rewritee, no arquivo VirtualHosts, altere 'AllowOverride None' para 'AllowOverride All', deve funcionar. O arquivo VirtualHosts se aplica se você estiver executando vários nomes de domínio no mesmo servidor (e endereço IP). Você o configuraria para configurar o domínio.
Jason Preston #
83

Tente definir: AllowOverride All.


O segundo problema mais comum é não ter a reescrita de mod ativada: a2enmod rewritee reinicie o apache.

Jarrod
fonte
Essa deve ser a resposta nº 1, pois resolve um problema que está acontecendo em uma instalação padrão do ubuntu!
Sliq
1
Isso permitirá que .htaccess substitua qualquer outra configuração do apache. Isto não é recomendado.
Bhargav Nanekalva
Sim :) esse também era meu problema, mas aqui é o lugar que você está explicando para novatos como eu que este "AllowOverride All" está em /etc/apache2/sites-available/[sitename.la.conf e [sitename-ssl] .conf. Eu tive que fazer uma segunda pesquisa por sua causa: D, a propósito, obrigado!
MetaTron 19/04
77

Se não funcionar, tente editar / etc / apache2 / sites-enabled / 000-default

quase no topo você encontrará

<Directory /var/www/>
    Options Indexes FollowSymLinks MultiViews
    AllowOverride None
    Order allow,deny
    allow from all
</Directory>

Mude AllowOverride NoneparaAllowOverride All

isso funcionou para mim

Martin Sax
fonte
Erro alterado de /laravel/public/authors was not found on this serverpara/index.php was not found on this server
Gangaraju 27/10
não consigo encontrar <Diretório>, apenas <VirtualHost *: 80>
Nicolas S.Xu 08/08
1
@ NicolasS.Xu colocar isso no <VirtualHost *: 80> tag
wimdetr
Fiz o mesmo, mas adicionei uma nova seção <Directory /var/www/html>para aplicar a regra somente desta pasta e acima.
Louis Loudog Trottier
44

No Ubuntu:

Corre:

a2enmod rewrite

e depois:

service apache2 restart

mod_rewrite agora será ativado!

nickleefly
fonte
28

Existem várias maneiras de corrigir esse problema, se você souber a raiz do problema.

Problema 1

Primeiramente, pode ser um problema com o seu apache não ter o módulo mod_rewrite.c instalado ou ativado.

Por esse motivo, você teria que habilitá-lo da seguinte maneira

  1. Abra seu console e digite:

    sudo a2enmod rewrite

  2. Reinicie seu servidor apache.

    service apache2 restart

Problema 2

  1. Além disso, além disso, se não funcionar, é necessário alterar a regra de substituição do arquivo conf do apache (apache2.conf, http.conf ou arquivo padrão 000).

  2. Localize "Directory / var / www /"

  3. Altere "Substituir nenhum" para "Substituir tudo"

Problema 3

Se você receber um erro informando que o módulo de reescrita não foi encontrado, provavelmente o seu módulo userdir não está ativado. Por esse motivo, você precisa habilitá-lo.

  1. Digite isso no console:

    sudo a2enmod userdir

  2. Em seguida, tente ativar o módulo de reescrita se ainda não estiver ativado (como mencionado acima).

Para ler mais sobre isso, você pode visitar este site: http://seventhsoulmountain.blogspot.com/2014/02/wordpress-permalink-ubuntu-problem-solutions.html

Kripa Jayakumar
fonte
2
Grande detalhamento do problema.
Banago
Não use, AllowOverride Allpois isso habilitará muitos recursos perigosos (como o uso de scripts perl). Em vez disso useAllowOveride Options
Marki555
28

A nova versão do apache mudou de alguma forma. Se a sua versão do apache for 2.4, você deverá acessar /etc/apache2/. Haverá um arquivo chamado apache2.conf. Você precisa editar esse (você deve ter permissão de root). Alterar o texto do diretório como este

<Directory /var/www/>
    Options Indexes FollowSymLinks
    AllowOverride All
    Require all granted
</Directory>

Agora reinicie o apache.

service apache2 reload

Espero que funcione.

Ijas Ahamed N
fonte
Esta é a resposta atualizada.
paulc 31/07
1
Se você está em 2019 e além, por favor upvote esta resposta :)
Luiz Cavalcanti
27

Abra o terminal e digite a2enmod rewrite, Ele habilitará o seu mod_rewritemódulo para Apache.

Em seguida, vá para /etc/apache2/sites-availablee edite o arquivo padrão. (Para isso, você deve ter permissões de gravação neste arquivo e na pasta disponível em sites.)

Substitua abaixo pelas linhas existentes 4 a 14

DocumentRoot /var/www
<Directory />
Options FollowSymLinks
AllowOverride All
</Directory>
<Directory /var/www/>
Options Indexes FollowSymLinks MultiViews
AllowOverride All
Order allow,deny
allow from all
</Directory>

Agora reinicie seu apache por /etc/init.d/apache2 restartouservice apache2 restart

Faça o teste de URL limpo novamente e desta vez será aprovado.

Umesh Patil
fonte
15

<edit>

Só notei que você disse mod_rewrite.s em vez de mod_rewrite.so - espero que seja um erro de digitação na sua pergunta e não no arquivo httpd.conf! :)

</edit>

Estou mais acostumado a usar o Apache no Linux, mas tive que fazer isso outro dia.

Primeiro, dê uma olhada no diretório de instalação do Apache. (Presumo que você o tenha instalado em "C: \ Arquivos de Programas" aqui)

Dê uma olhada na pasta: "C: \ Arquivos de programas \ Apache Software Foundation \ Apache2.2 \ modules" e verifique se há um arquivo chamado mod_rewrite.so lá. (Deveria ser, é fornecido como parte da instalação padrão.

Em seguida, abra "C: \ Arquivos de Programas \ Apache Software Foundation \ Apache2.2 \ conf" e abra httpd.conf. Verifique se a linha:

#LoadModule rewrite_module modules/mod_rewrite.so

é descomentado:

LoadModule rewrite_module modules/mod_rewrite.so

Além disso, se você deseja ativar o RewriteEngine por padrão, pode adicionar algo como

<IfModule mod_rewrite>
    RewriteEngine On
</IfModule>

até o final do seu arquivo httpd.conf.

Caso contrário, especifique

RewriteEngine On

em algum lugar do seu arquivo .htaccess.

Danny Battison
fonte
@gabehabe seu avatar apenas apenas parecia que estava segurando um ícone meu doc, lol
Jonathan dos Santos
5

Eu acabei de fazer isso

sudo a2enmod rewrite

você precisará reiniciar o serviço apache seguindo o comando

sudo service apache2 restart
user3470929
fonte
4

Use o comando abaixo

sudo a2enmod rewrite

E o comando apache restart através do comando abaixo

sudo service apache2 restart
prasoon
fonte
3

Obviamente, há mais de uma maneira de fazer isso, mas eu sugiro usar o mais padrão:

ErrorDocument 404 /index.php?page=404
Michael Cramer
fonte
3

Na primeira vez em que lutei com as regras mod_rewrite que ignoravam meu tráfego, aprendi (frustrantemente) que as colocara incorretas <VirtualHost>, o que significava que meu tráfego ignoraria todas elas, independentemente de quão bem escritas elas fossem. Verifique se isso não está acontecendo com você:

# Change the log location to suit your system. RewriteLog /var/log/apache-rw.log RewriteLogLevel 2

Esses parâmetros serão ativados se você executar uma reinicialização normal do Apache, para poder reciclá-los e monitorar de perto o comportamento do mod_rewrite. Quando o seu problema estiver resolvido, diminua o RewriteLogLevel e comemore.

Em 100% da minha experiência, descobri que o RewriteLog me ajudou a descobrir o problema com minhas regras de reescrita. Eu não posso recomendar isso o suficiente. Boa sorte na sua solução de problemas!

Além disso, este indicador é seu melhor amigo: http://httpd.apache.org/docs/2.2/mod/mod_rewrite.html#rewritelog

Garrett Ellis
fonte
2

O que funcionou para mim (no ubuntu):

sudo su
cd /etc/apache2/mods-enabled
ln ../mods-available/rewrite.load rewrite.load

Além disso, como já mencionado, verifique se AllowOverride allestá definido na seção relevante do/etc/apache2/sites-available/default

Benubird
fonte