Zamiana brzydkich URL na ładne - problem

Tutaj dyskutujemy o PHP oraz zgłaszamy i rozwiązujemy problemy dotyczące tego języka.
mar3
Bywalec
Bywalec
Posty: 44
Dołączył(a): poniedziałek, 15 czerwca 2009, 16:15

Zamiana brzydkich URL na ładne - problem

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

Re: Zamiana brzydkich URL na ładne - problem

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

Re: Zamiana brzydkich URL na ładne - problem

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

Re: Zamiana brzydkich URL na ładne - problem

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

Re: Zamiana brzydkich URL na ładne - problem

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

Re: Zamiana brzydkich URL na ładne - problem

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

Re: Zamiana brzydkich URL na ładne - problem

Post przez mar3 »

Bardzo dziękuję za pomoc.
Post Reply