Jump to content
Sign in to follow this  
PF2G

[Resolvido] Clean URLs com .htaccess

Recommended Posts

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

Share this post


Link to post
Share on other 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.

Edited by yoda

Share this post


Link to post
Share on other 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?

Share this post


Link to post
Share on other 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>';
}

Edited by yoda

Share this post


Link to post
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Restore formatting

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

Sign in to follow this  

×
×
  • Create New...

Important Information

By using this site you accept our Terms of Use and Privacy Policy. We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.