Zamiana brzydkich URL na ładne - problem

Tutaj dyskutujemy o PHP oraz zgłaszamy i rozwiązujemy problemy dotyczące tego języka.

Zamiana brzydkich URL na ładne - problem

Postprzez mar3 » sobota, 23 kwietnia 2011, 16:39

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.
mar3
Bywalec
Bywalec
 
Posty: 40
Dołączył(a): poniedziałek, 15 czerwca 2009, 16:15

Re: Zamiana brzydkich URL na ładne - problem

Postprzez Morfidon » niedziela, 24 kwietnia 2011, 11:49

Przyglądnij się w PHP manual:
http://php.net/manual/en/function.include.php
na "Example #3 include() through HTTP" lub na tę metodę.
Morfidon
Administrator
Administrator
 
Posty: 593
Dołączył(a): wtorek, 5 sierpnia 2008, 21:48

Re: Zamiana brzydkich URL na ładne - problem

Postprzez mar3 » piątek, 29 kwietnia 2011, 11:13

Dziękuję za pomoc,. Udało mi się napisać coś takiego:
- plik .htaccess
Kod: 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
Kod: 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?
mar3
Bywalec
Bywalec
 
Posty: 40
Dołączył(a): poniedziałek, 15 czerwca 2009, 16:15

Re: Zamiana brzydkich URL na ładne - problem

Postprzez Morfidon » piątek, 29 kwietnia 2011, 11:36

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
Morfidon
Administrator
Administrator
 
Posty: 593
Dołączył(a): wtorek, 5 sierpnia 2008, 21:48

Re: Zamiana brzydkich URL na ładne - problem

Postprzez mar3 » piątek, 29 kwietnia 2011, 12:58

Gdy dodałem R=301 do:
Kod: 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/.
mar3
Bywalec
Bywalec
 
Posty: 40
Dołączył(a): poniedziałek, 15 czerwca 2009, 16:15

Re: Zamiana brzydkich URL na ładne - problem

Postprzez Morfidon » piątek, 29 kwietnia 2011, 18:41

Nie analizowałem Twojego kodu PHP.

W takim wypadku przed headerem z location daj:
Kod: Zaznacz cały
Header( "HTTP/1.1 301 Moved Permanently" );


Strasznie to zamieszałeś.
Morfidon
Administrator
Administrator
 
Posty: 593
Dołączył(a): wtorek, 5 sierpnia 2008, 21:48

Re: Zamiana brzydkich URL na ładne - problem

Postprzez mar3 » piątek, 29 kwietnia 2011, 21:44

Bardzo dziękuję za pomoc.
mar3
Bywalec
Bywalec
 
Posty: 40
Dołączył(a): poniedziałek, 15 czerwca 2009, 16:15


Powrót do PHP

Kto przegląda forum

Użytkownicy przeglądający ten dział: Brak zidentyfikowanych użytkowników i 1 gość

cron