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.