[Resolvido] Urls amigáveis com .htaccess está dando erro 404.

Iniciado por brpassosrj, 01 de Junho de 2013, 18:15

tópico anterior - próximo tópico

brpassosrj

Olá pessoal, pesquisei meu problema no google e no fórum e não achei nada que pudesse me ajudar, então resolvi abrir este tópico.

Instalei pela primeira vez o Ubuntu 13.04 e estou configurando meu ambiente de programação para desenvolvimento em php.

Instalei o apache, php e mysql com o comando:

sudo apt-get install lamp-server^

Depois executei o comando abaixo para ativar o mod_rewrite;

sudo a2enmod rewrite

Alterei o arquivo /etc/apache2/sites-available/default abaixo colocando AllowOverride None para AllowOverride All

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

OBS: Alguns tutoriais diziam para alterar apenas o do <Directory /var/www/> e outros diziam para alterar também o do <Directory />. Fiz das duas formas porém com o mesmo resultado.

Reiniciei o apache com o comando:

sudo /etc/init.d/apache2 restart

Verifiquei se está rodando com o comando:

sudo apache2ctl -M

Apareceu uma lista com diversos itens e dentre eles tinha o rewrite_module (shared)

Tenho um projeto já com o index.php com o código para url amigável e o .htaccess com o código também. Devo informar que isso já funciona no servidor web e em outra máquina windows. Apenas neste novo ambiente que não consegui fazer funcionar.

O .htaccess:

RewriteEngine On
RewriteCond %{SCRIPT_FILENAME} !-f
RewriteCond %{SCRIPT_FILENAME} !-d
RewriteRule ^(.*)$ index.php?pg=$1

Quando tento acessar um link como:

localhost/meusite/quem-somos/

aparece o erro de 404. Não deveria ser assim, pois no index já tem tudo configurado para com este link fazer um include da página quem-somos.php dentro da página index.php. Lembrando que no servidor uso o mesmo projeto e está funcionando. No servidor uso o Cpanel/WHM com o linux CentOS.

Fiz um teste e coloquei um echo para variavel $pg no index e forcei uma página no link que não existia como por exemplo localhost/meusite/teste/ e no echo saiu o valor "teste/", ou seja, aparentemente o que é digitado depois de meusite/ vai normalmente para a variavel $pg se o arquivo não existir, mas quando o arquivo existe aparece o erro de 404.

Desde já agradeço pela colaboração de vocês!



zekkerj

Citar<Directory /var/www/>
O diretório raiz normal do Apache não é "/var/www/htdocs"???
Pesquise antes de perguntar, sua dúvida pode já ter sido respondida.
Não respondo dúvidas por MP, coloque sua dúvida no fórum onde ela pode ser pesquisada pelos seus colegas!
Não venha ao fórum apenas para perguntar. Se você sabe a resposta de um problema, porque não ajudar seu colega? ;D

brpassosrj

Citação de: zekkerj online 01 de Junho de 2013, 21:01
Citar<Directory /var/www/>
O diretório raiz normal do Apache não é "/var/www/htdocs"???

No meu caso não, dê uma olhada nesse link por exemplo:

http://setupguides.blogspot.com.br/2013/04/install-lamp-in-ubuntu-1304.html

zekkerj

Sobre o "<Directory />", vc não está confundindo com "<Location />"? O tag "Directory" lida com endereços absolutos, quando vc faz um "<Directory />" vc está se referindo ao seu diretório raiz, que não deveria ser acessível nunca pelo apache.

Sobre o erro 404 que vc recebe, podemos descobrir qual é o caminho que está sendo usado consultando o log de erro em /var/log/apache2/error_log.
Pesquise antes de perguntar, sua dúvida pode já ter sido respondida.
Não respondo dúvidas por MP, coloque sua dúvida no fórum onde ela pode ser pesquisada pelos seus colegas!
Não venha ao fórum apenas para perguntar. Se você sabe a resposta de um problema, porque não ajudar seu colega? ;D

brpassosrj

#4
Citação de: zekkerj online 02 de Junho de 2013, 01:49
Sobre o "<Directory />", vc não está confundindo com "<Location />"? O tag "Directory" lida com endereços absolutos, quando vc faz um "<Directory />" vc está se referindo ao seu diretório raiz, que não deveria ser acessível nunca pelo apache.

Sobre o erro 404 que vc recebe, podemos descobrir qual é o caminho que está sendo usado consultando o log de erro em /var/log/apache2/error_log.

Em relação ao <Directory /> eu apenas coloquei o AllowOverride de None para All pq em alguns tutoriais diziam para fazer isso. No inicio segui o tutorial do link que mandei anteriormente, mas como não havia funcionado fiquei caçando na internet e tinha gente que pedia pra mudar esse também. Mas de qualquer forma coloquei ele para None agora e reiniciei o apache mas deu na mesma.

As linhas que apareceram do error_log no último teste foram:

[Sun Jun 02 01:59:21 2013] [error] [client 127.0.0.1] Negotiation: discovered file(s) matching request: /var/www/sistemaesite/oque_e (None could be negotiated).
[Sun Jun 02 01:59:21 2013] [error] [client 127.0.0.1] File does not exist: /var/www/favicon.ico

Em relação a primeira linha do erro diz respeito a pagina que deveria ser acessada usando a url amigável, mas não está sendo.

no browser eu coloco /localhost/sistemaesite/oque_e/

isso deveria fazer um include na pagina index.php da página oque_e.php, mais não está fazendo.

se eu tentar colocar /localhost/sistemaesite/oque_e_teste/

o echo que eu coloquei no index mostra o valor "oque_e_teste/"

mas essa página oque_e_teste.php não existe.

Então com isso eu percebi que a url amigável não funciona quando a página existe, mas funciona quando ela não existe. Isso tá super estranho.


brpassosrj

Graças a Deus e com a sua ajuda descobri o problema zekkerj  :D

Como você me alertou para checar o arquivo error_log eu fiz uma pesquisa no google utilizando parte da mensagem de erro escrevendo "htaccess (None could be negotiated)" e descobri o link abaixo:

http://www.bennadel.com/blog/2218-Negotiation-Discovered-File-s-Matching-Request-None-Could-Be-Negotiated.htm

O cara passou por um problema parecido com o meu e o que tive que fazer foi remover a palavra MultiViews do trecho de código abaixo do arquivo "/etc/apache2/sites-available/default"

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

Ficando desta forma:

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

Com isso funcionou!

Obrigado pela ajuda zekkerj  :)

nelk99

Muito bom tópico. Realmente a última configuração do default do apache2 ajudou a resolver o mesmo problema na minha máquina. Valeu a ajuda.