Duvida sobre htaccess – php html htaccess
Pergunta:
Tenho um link amigável que seria localhost/artists/nome-do-artista/, porém quero criar páginas dentro dela por exemplo Biografia. localhost/artists/nome-do-artista/biography, só que o meu htaccess não permite, como resolver?
Estou utilizando:
RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule (.*) index.php [NC,QSA]
Em artists/index.php está fazendo uma consulta no banco de dados com nome do artista ficando desse jeito o link: artists/nome-do-artista.
Porém quando crio artists/nome-do-artista/biography ele busca a index principal que seria: artists/nome-do-artista.
Espero que tenham entendido, se puderem me ajudar fico lisonjeado.
Autor da pergunta Erick Pereira
Resposta :
Como eu não sei como é a sua estrutura de pastas e como você está identificando o nome do artista e etc. Vou deixar uma resposta simples, mas que você pode adaptar.
Estrutura da Pasta:
.
├── artists
│ ├── albums.php
│ ├── biography.php
│ └── index.php
└── index.php
.htaccess
RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule artists/(.*)(?:/(.*))? /artists/index.php?artist=$1&page=$2 [L]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule (.*) index.php [L]
Na primeira regra do rewrite nós definimos — através do regex —, que todo acesso em http://www.example.com/artists/... deve ser redirecionado para a pasta artists/index.php com os parâmetros definidos.
Explicando o Regex:
artists/(.*)(?:/(.*))?
└───┬──┘└─┬─┘└──┬────┘
│ │ └──────── Captura o nome da página. O `?` indica que ele é opcional.
│ └────────────── Captura o nome do artista
└──────────────────── Base
artists/index.php
<?php
$artist = $_GET["artist"] ?? false;
$page = $_GET["page"] ?? "albums";
if ( $artist ) {
$model = new ArtistModel();
if( $model->has($artist) ) {
switch ($page) {
case "biography":
$content = $model->getBiography();
require_once "biography.php";
break;
case "albums":
default:
$content = $model->getAlbums();
require_once "biography.php";
break;
}
}
} else {
echo "Not found";
}
Atenção! Esse é apenas um exemplo básico. Você não deve usar em produção, apenas para estudos e para ser otimizado/adaptado ao seu código.
Uma outra resposta (não tão boa quanto a anterior), seria esse htaccess (comentarios no codigo):
RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
# redirecionada todas as urls que terminarem com /biography para a
# pagina biografia.php (foge um pouco do padrão front controller),
# mas imagino que seja o que você queria inicialmente.
# O ([a-zA-Z0-9-]+) captura qualquer caracter alphanumerico incluindo
# o -, e armazena em $1, que posteriormente é passado para a query
# como nomeartista, que pode ser acessado pelo global
# $_GET ($_GET['nomeartista']).
# Além disso é passado o argumento [L] indicando que se houver um match
# esse é o ultimo rewrite.
RewriteRule ^artists/([a-zA-Z0-9-]+)/biography biografia.php?nomeartista=$1 [NC,QSA,L]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule (.*) index.php [NC,QSA,L]
Não sei se está dentro das suas possibilidades utilizar algum framework para automatizar a criação de rotas, caso esteja, considere dar uma olhada no FastRoute.
Para se aprofundar na escrita de htaccess dê uma olhada no guia do apache mod_rewrite.



