Strona 1 z 1
Zamiana brzydkich URL na ładne - problem
Napisane: sobota, 23 kwietnia 2011, 16:39
przez mar3
Chciałem skorzystać ze skryptu przedstawionego w kursie pozycjonowania. Problem w tym, że mam dużo podstron(w plikach .php). Dlatego pomyślalem, że w tabeli categories oraz strony (w bazie danych) dodam kolumnę url(w której będę przechowywał np. skrypt.php), a w skrypcie index.php będę dołączał za pomocą funkcji include() skrypt php którego URL jest w bazie danych. Mam problem jak postąpić z plikami, które wymagają przesłania zmiennych metodą GET. Np. skrypt.php?id=1. Funkcjami include(), require() już próbowałem, ale wyskakuje błąd.
Re: Zamiana brzydkich URL na ładne - problem
Napisane: niedziela, 24 kwietnia 2011, 11:49
przez Morfidon
Przyglądnij się w PHP manual:
http://php.net/manual/en/function.include.php
na "Example #3 include() through HTTP" lub na
tę metodę.
Re: Zamiana brzydkich URL na ładne - problem
Napisane: piątek, 29 kwietnia 2011, 11:13
przez mar3
Dziękuję za pomoc,. Udało mi się napisać coś takiego:
- plik .htaccess
Code: Zaznacz cały
RewriteEngine On
RewriteBase /re-rewting/
RewriteCond %{QUERY_STRING} ^([a-zA-Z0-9]+=[a-zA-Z0-9]+)&([a-zA-Z0-9]+=[a-zA-Z0-9]+)&([a-zA-Z0-9]+=[a-zA-Z0-9]+)$
RewriteRule ^([^(index)][a-zA-Z0-9-_/.]+\.php)$ index.php?page=$1-__-%1-___-%2-___-%3 [L]
RewriteCond %{QUERY_STRING} ^([a-zA-Z0-9]+=[a-zA-Z0-9]+)&([a-zA-Z0-9]+=[a-zA-Z0-9]+)$
RewriteRule ^([^(index)][a-zA-Z0-9-_/.]+\.php)$ index.php?page=$1-__-%1-___-%2 [L]
RewriteCond %{QUERY_STRING} ^([a-zA-Z0-9]+=[a-zA-Z0-9]+)$
RewriteRule ^([^(index)][a-zA-Z0-9-_/.]+\.php)$ index.php?page=$1+-+%{QUERY_STRING} [L]
RewriteRule ^([^(index)][a-zA-Z0-9-_/.]+\.php)$ index.php?page=$1 [L]
RewriteCond %{REQUEST_URI} [^/]$
RewriteRule ^([^.]+)$ $1/ [R=301,L]
RewriteRule ^([^.]+)/$ /re-rewting/index.php?page=$1 [L]
-plik index.php
Code: Zaznacz cały
<?php
ob_start();
require_once("database_connect.php");
function error_404($message="")
{
header("HTTP/1.0 404 Not Found");
echo $message;
include('404.shtml');
exit;
}
function is_available($page, $dbc)
{
$page = mysqli_real_escape_string($dbc, $page); //mini zabezpieczenie
$parentCategoryId = 0; //id kategori nadrzędnej
if ((strpos($page, ".htm") == false) && (strpos($page, ".html") == false) && (strpos($page, ".php") == false)) //jezeli kategoria
{
$categoriesAndPages = explode("/", $page); //rozbicie na kategorie
for ($i = 0; $i < count($categoriesAndPages); $i++)
{
$q = "SELECT id FROM categories WHERE category_name = '".$categoriesAndPages[$i]."' AND parent_category_id = ".$parentCategoryId;
$category = mysqli_query($dbc, $q);
if (mysqli_num_rows($category))
{
$category = mysqli_fetch_assoc($category);
$parentCategoryId = $category['id'];
if (count($categoriesAndPages) == ($i + 1))
{
$category = mysqli_query($dbc, "SELECT category_URL FROM categories WHERE category_name = '".$categoriesAndPages[$i]."' ") or die (mysql_error());
$category = mysqli_fetch_assoc($category);
if (strpos($category['category_URL'], "?"))
{
$url = explode("?", $category['category_URL']);
$get_vars = explode("&", $url[1]);
for ($i= 0; $i < count($get_vars); $i++)
{
$get_var = explode("=", $get_vars[$i]);
$_GET[$get_var[0]] = $get_var[1];
}
include $url[0];
exit();
}
else
{
include $category['category_URL'];
exit();
}
}
}
else
error_404();
}
}
else //w innym wypadku "plik .htm/.html/.php"
{
$page = str_replace("-__-", "?", $page);
$page = str_replace("-___-", "&", $page);
$q = "SELECT category_name, parent_category_id FROM categories WHERE category_URL = '".$page."'";
//echo $q . '<br />';
$category = mysqli_query($dbc, $q);
if(mysqli_num_rows($category) == 1)
{
$category = mysqli_fetch_assoc($category);
$parentCategoryId = $category['parent_category_id'];
if($parentCategoryId == 0)
{
header("location: /re-rewting/" . $category['category_name'] . "/");
}
else
{
$categoriesName = $category['category_name']; //przechowuje nowy url z nazwami kategorii np. "/gry/Kolko-krzyzyk/"
for ($i = 0;;$i++)
{
$q = "SELECT category_name, parent_category_id FROM categories WHERE id = ".$parentCategoryId;
$category = mysqli_query($dbc, $q);
if(mysqli_num_rows($category) == 1)
{
$category = mysqli_fetch_assoc($category);
$categoriesName = $category['category_name'] . "/" . $categoriesName;
$parentCategoryId = $category['parent_category_id'];
if($category['parent_category_id'] == 0)
break;
}
else
error_404();
}
header("location: /re-rewting/" . $categoriesName) . "/";
}
}
else
{
if (strpos($page, "?"))
{
$url = explode("?", $page);
$get_vars = explode("&", $url[1]);
for ($i= 0; $i < count($get_vars); $i++)
{
$get_var = explode("=", $get_vars[$i]);
$_GET[$get_var[0]] = $get_var[1];
}
include $url[0];
exit();
}
else
{
include $page;
exit();
}
error_404();
}
}
}
if (isset($_GET['page']))
{
$page = $_GET['page'];
echo $_GET['page'];
if(!empty($page))
{
is_available($page, $dbc);
}
}
else
{
include "poczatek.html";
exit;
}
ob_flush();
?>
Mam jeszcze kilka pytań:
1)Do czego służy i czy ma znaczenie w pozycjonowaniu linijka
"header("HTTP/1.0 404 Not Found");"? Gdy wywoływała się funkcja
error_404() to w Firefox wszystko było OK wyświetlał się plik 404.shtml, ale w Google Chrome wyświetlał się domyślny komunikat tej przeglądarki. Gdy usunąłem tę linijkę to i w Google Chrome wyświetlała się strona 404.shtml
2)Czy ten skrypt nie obciąża za bardzo serwera?
3)Czy moc ze starych linków (np. skrypt.php?id=1) przejdzie na nowe (np. /dzial/)?
4)Czy jest coś co mogę jeszcze poprawić w tych plikach?
Re: Zamiana brzydkich URL na ładne - problem
Napisane: piątek, 29 kwietnia 2011, 11:36
przez Morfidon
1) zwracając nagłówek informujesz bota, użytkownika, że strona, którą odwiedził nie istnieje, nie ma to specjalnie wpływu na pozycjonowanie, aczkolwiek dobrze jeśli URL'e, które nie istnieją zwracają taki error.
2) nie
3) nie, musisz dodać R=301 wszędzie w .htaccess po przekierowaniu
4) jak wyżej
Re: Zamiana brzydkich URL na ładne - problem
Napisane: piątek, 29 kwietnia 2011, 12:58
przez mar3
Gdy dodałem R=301 do:
Code: Zaznacz cały
RewriteCond %{QUERY_STRING} ^([a-zA-Z0-9]+=[a-zA-Z0-9]+)$
RewriteRule ^([^(index)][a-zA-Z0-9-_/.]+\.php)$ index.php?page=$1+-+%{QUERY_STRING} [R=301,L]
To czy Google-bot będzie wiedział, że moc ze starego linku (np. skrypt.php?id=1) ma przenieść na nowy link (np. /dzial/), a nie na np. index.php?page=skrypt.php-__-id=1 ? Bo przecież ta linijka przenosi na np. index.php?page=skrypt.php-__-id=1, a dopiero skrypt index.php przenosi za pomocą header("location: /dzial/") na np. /dzial/.
Re: Zamiana brzydkich URL na ładne - problem
Napisane: piątek, 29 kwietnia 2011, 18:41
przez Morfidon
Nie analizowałem Twojego kodu PHP.
W takim wypadku przed headerem z location daj:
Code: Zaznacz cały
Header( "HTTP/1.1 301 Moved Permanently" );
Strasznie to zamieszałeś.
Re: Zamiana brzydkich URL na ładne - problem
Napisane: piątek, 29 kwietnia 2011, 21:44
przez mar3
Bardzo dziękuję za pomoc.