Se você quiser apenas alterar a rota para picture.php
adicionar regras de reescrita .htaccess
, atenderá às suas necessidades, mas, se desejar reescrever a URL como no Wordpress, o PHP é o caminho. Aqui está um exemplo simples para começar.
Estrutura de pastas
Existem dois arquivos que são necessários na pasta raiz .htaccess
e index.php
, e seria bom colocar o restante dos .php
arquivos em uma pasta separada, como inc/
.
root/
inc/
.htaccess
index.php
.htaccess
RewriteEngine On
RewriteRule ^inc/.*$ index.php
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^(.*)$ index.php [QSA,L]
Este arquivo possui quatro diretivas:
RewriteEngine
- ativar o mecanismo de reescrita
RewriteRule
- negar acesso a todos os arquivos da inc/
pasta, redirecionar qualquer chamada para essa pasta paraindex.php
RewriteCond
- permite acesso direto a todos os outros arquivos (como imagens, css ou scripts)
RewriteRule
- redirecione qualquer outra coisa para index.php
index.php
Como agora tudo é redirecionado para index.php, será determinado se o URL está correto, todos os parâmetros estão presentes e se o tipo de parâmetro está correto.
Para testar o URL, precisamos ter um conjunto de regras e a melhor ferramenta para isso é uma expressão regular. Usando expressões regulares, mataremos duas moscas com um golpe. Url, para passar neste teste deve ter todos os parâmetros necessários testados em caracteres permitidos. Aqui estão alguns exemplos de regras.
$rules = array(
'picture' => "/picture/(?'text'[^/]+)/(?'id'\d+)", // '/picture/some-text/51'
'album' => "/album/(?'album'[\w\-]+)", // '/album/album-slug'
'category' => "/category/(?'category'[\w\-]+)", // '/category/category-slug'
'page' => "/page/(?'page'about|contact)", // '/page/about', '/page/contact'
'post' => "/(?'post'[\w\-]+)", // '/post-slug'
'home' => "/" // '/'
);
O próximo passo é preparar a solicitação uri.
$uri = rtrim( dirname($_SERVER["SCRIPT_NAME"]), '/' );
$uri = '/' . trim( str_replace( $uri, '', $_SERVER['REQUEST_URI'] ), '/' );
$uri = urldecode( $uri );
Agora que temos o pedido uri, a etapa final é testar o uri nas regras de expressão regular.
foreach ( $rules as $action => $rule ) {
if ( preg_match( '~^'.$rule.'$~i', $uri, $params ) ) {
/* now you know the action and parameters so you can
* include appropriate template file ( or proceed in some other way )
*/
}
}
Uma correspondência bem-sucedida, como usamos subpadrões nomeados em regex, preencherá a $params
matriz quase da mesma forma que o PHP preenche a $_GET
matriz. No entanto, ao usar um URL dinâmico, a $_GET
matriz é preenchida sem nenhuma verificação dos parâmetros.
/ foto / alguns + texto / 51
Matriz
(
[0] => / imagem / algum texto / 51
[text] => algum texto
[1] => algum texto
[id] => 51
[2] => 51
)
picture.php? text = some + text & id = 51
Matriz
(
[text] => algum texto
[id] => 51
)
Essas poucas linhas de código e um conhecimento básico de expressões regulares são suficientes para começar a construir um sistema de roteamento sólido.
Fonte completa
define( 'INCLUDE_DIR', dirname( __FILE__ ) . '/inc/' );
$rules = array(
'picture' => "/picture/(?'text'[^/]+)/(?'id'\d+)", // '/picture/some-text/51'
'album' => "/album/(?'album'[\w\-]+)", // '/album/album-slug'
'category' => "/category/(?'category'[\w\-]+)", // '/category/category-slug'
'page' => "/page/(?'page'about|contact)", // '/page/about', '/page/contact'
'post' => "/(?'post'[\w\-]+)", // '/post-slug'
'home' => "/" // '/'
);
$uri = rtrim( dirname($_SERVER["SCRIPT_NAME"]), '/' );
$uri = '/' . trim( str_replace( $uri, '', $_SERVER['REQUEST_URI'] ), '/' );
$uri = urldecode( $uri );
foreach ( $rules as $action => $rule ) {
if ( preg_match( '~^'.$rule.'$~i', $uri, $params ) ) {
/* now you know the action and parameters so you can
* include appropriate template file ( or proceed in some other way )
*/
include( INCLUDE_DIR . $action . '.php' );
// exit to avoid the 404 message
exit();
}
}
// nothing is found so handle the 404 error
include( INCLUDE_DIR . '404.php' );