Ir para o conteúdo
  • Revista PROGRAMAR: Já está disponível a edição #60 da revista programar. Faz já o download aqui!

PF2G

[Resolvido] Clean URLs com .htaccess

Mensagens Recomendadas

PF2G

Boa tarde,

eu estou a desenvolver um website e neste momento estou a trabalhar com .htaccess, mas é a primeira vez que trabalho com isto.

O que eu quero fazer é passar:

localhost/site.com/styles.php?id=2

para:

localhost/site.com/pages/styles/2

Será que alguém me pode dar umas dicas?

Obrigado.

Cumprimentos,

PF2G

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
yoda

Uso isto em todos :

RewriteEngine On
RewriteBase /

options +FollowSymLinks

<Files .*>
Order Deny,Allow
Deny From All
</Files>

RewriteRule ^(?:private)\b.* index.php/$0 [L]

RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d

RewriteRule .* index.php/$0 [PT]

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
yoda

Eu uso expressões regulares (mas há outros métodos mais simples). Se quiseres usar, aqui está um exemplo :

$request = new stdClass;
$routes = array(
'default' => array(
 'regex' => '(?P<controller>[\w-]+)?(?:/(?P<action>[\w-]+)(?:/(?P<id>[\d]+))?)?',
 'defaults' => array(
  'controller' => 'dashboard',
  'action' => 'index',
  'id' => false,
 )
)
);
$found = false;
foreach ($routes as $name=>$route)
{
# attempt to match uri
preg_match('#^'.$route['regex'].'$#uD', $uri, $matches);
if (!empty($matches))
{
 $request->params = array();

 $found = true;

 # save route name
 $request->route = $name;

 # cross request params with route default params
 foreach ($route['defaults'] as $key=>$value)
 {
  # lowercase key
  $key = strtolower($key);

  # ensure no required value is empty
  $value = (isset($matches[$key]) && $matches[$key] != '') ? $matches[$key] : $value;

  # populate request param
  $request->params[$key] = $value;
 }

 break;
}
}

Basicamente o que isto faz é comparar o URI com uma "rota" em regex, se houver alguma que coincida com as regras, o script passa os parâmetros para uma classe.

Editado por yoda

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
PF2G

Neste momento tenho este .htaccess:

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

no header.php tenho:

// get the url
$uri = (isset($_SERVER['REQUEST_URI']))?$_SERVER['REQUEST_URI']: false;
$query = (isset($_SERVER['QUERY_STRING']))?$_SERVER['QUERY_STRING']: '';
$url = str_replace($query,'',$uri); // you can edit this part to do something with the query
$arr = explode('/',$url);
array_shift($arr);
// get the correct page to display
$controller =!empty($arr[0])?$arr[0]:'home'; // $arr[0] could be product/
$action = isset($arr[1]) && !empty($arr[1])?$arr[1]:'index'; // $arr[1] can be product-title

(...)

echo '<title> $action </title>';

Esta é a maneira como tenho os ficheiros organizados.

67050675.png

O meu problema é:

- Quando entro no index.php o title aparece-me como "index" e quando entro em pages/noticias o title é "pages".

Como faço para me aparecer "Index" e quando entrar em "pages/pagina.php" aprecer "Pagina" no titulo?

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
yoda

Este é o .htaccess, ficheiro que aplica as regras de conversão dos uri's :

RewriteEngine On
RewriteBase /

options +FollowSymLinks

RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d

RewriteRule .* index.php/$0 [PT]

Este ficheiro aponta todos os requests para o index.php, que pode ser mudado. Para ler o uri no index.php basta algo como isto :

# pasta onde está o index.php, tendo em conta o url
# esta pasta deve também estar referenciada no htaccess, a seguir a RewriteBase
$base_url = '/pasta/';


# obter uri do request
$uri = rawurldecode($_SERVER['REQUEST_URI']);

# filtrar a pasta do uri
$uri = preg_replace('/('.str_replace('/','\/', $base_url).')(.*)/', '$2', $uri);


# remover "/" a mais
$uri = preg_replace('/\/+/', '/', $uri);

# remover primeiro e último "/" do uri
$uri = (substr($uri , 0, 1) == '/') ? substr($uri, 1) : $uri;
$uri = (substr($uri , -1) == '/') ? substr($uri, 0, -1) : $uri;


# obter segmentos do uri, ou caracteres entre as "/"
$segments = explode('/', $uri);

foreach ($segments as $key => $segment)
{
 echo $key.' : '.$segment.'<br>';
}

Editado por yoda

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites

Crie uma conta ou ligue-se para comentar

Só membros podem comentar

Criar nova conta

Registe para ter uma conta na nossa comunidade. É fácil!

Registar nova conta

Entra

Já tem conta? Inicie sessão aqui.

Entrar Agora

×

Aviso Sobre Cookies

Ao usar este site você aceita os nossos Termos de Uso e Política de Privacidade. Este site usa cookies para disponibilizar funcionalidades personalizadas. Para mais informações visite esta página.