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.

Fonte

Related Posts:

Qual a diferença entre AppCompatActivity e Activity? – android android-activity
Pergunta: Qual a diferença da AppCompatActivity para Activity ? A partir de qual versão a AppCompatActivity foi adicionada ao Android? Autor da pergunta Luhhh A diferença reside ...
Como abreviar palavras em PHP? – php string
Pergunta: Possuo informações comuns como nome de pessoas e endereços, e preciso que elas contenham no máximo 30 caracteres sem cortar palavras. Exemplo: 'Avenida Natalino João Brescansin' ...
Qual é a finalidade de um parêntese vazio numa declaração Lambda? – c# expressões-lambda característica-linguagem
Pergunta: Criei um exemplo de uma declaração Lambda sem argumentos, entretanto, estou com duvidas referente a omissão do parêntese vazio () na declaração. Veja o exemplo: class ...
Boas práticas para URI em API RESTful – api rest restful
Pergunta: Estou com dúvida em relação às URIs de alguns recursos da api que estou desenvolvendo. Tenho os recursos projetos e atividades com relação 1-N, ...
Dúvidas sobre a integração do MySQL com Java – java mysql netbeans
Pergunta: Estou criando um sistema no NetBeans, utilizando a linguagem Java e o banco de dados MySQL. Escrevi o seguinte código para realizar a conexão ...
Qual é a finalidade da pasta Model do framework Inphinit? – php inphinit
Pergunta: No Inphinit micro-framework existe a pasta Model que fica dentro da pasta application, e nela é onde ficam as classes, mas eu estou muito ...
Uso do ‘@’ em variáveis – javascript typescript coffeescript
Pergunta: Vejo em algumas linguagens que compilam para javascript, como TypeScript e CoffeeScript, o uso do @ em variáveis, como também, casos em que o ...
Qual tamanho máximo um arquivo JSON pode ter? – json arquivo
Pergunta: Vou dar um exemplo para conseguir explicar minha duvida: Preciso recuperar informação de imagens vindas de uma API, esse banco de imagens me retorna JSON's ...
O que é Teste de Regressão? – terminologia engenharia-de-software testes
Pergunta: Na matéria de Teste de Software o professor abordou um termo chamado Teste de Regressão, isto dentro da disciplina de teste de software. Sendo ...
O que é um construtor da linguagem? – php característica-linguagem
Pergunta: Em PHP, já li e ouvi várias vezes a respeito dos Construtores da Linguagem. Os casos que sempre ouvi falar deles foi em casos ...
Função intrínseca para converter numérico para string – cobol
Pergunta: Estou a tentar saber se existe alguma função intrínseca do COBOL para converter um data numérico para string sem precisar usar a cláusula REDEFINES: ( ...
Porque usar implements? – java android
Pergunta: Qual a diferença entre usar btn.setOnClickListener(new OnClickListener() { e public class MainActivity extends Activity implements OnClickListener{ Estive fazendo um curso de Android e meu professor falou que ...
O que é XHTML e quando deve ser usado? – html xml xhtml
Pergunta: O que eu sei é que o XHTML precisa ser XML válido. Isso implica, por exemplo, que todas as tags precisam ser fechadas. Por ...
Uma placa aceleradora de vídeo pode melhorar o desempenho não-gráfico? [fechada] – desempenho
Pergunta: Para desenvolver em Ruby on Rails, eu utilizo aqui uma máquina virtual do VirtualBox com Ubuntu Server 14.04 sem interface gráfica instalada. Recentemente descobri uma ...
Concat() VS Union() – c# .net
Pergunta: Qual a diferença entre Concat() e Union() ? Quando usar Concat() e quando usar Union() ? Somente pode ser usado em list ? ...

Deixe uma resposta

O seu endereço de email não será publicado. Campos obrigatórios marcados com *