Jump to content
php.lv forumi

Clean Urls


Andris

Recommended Posts

Beidzot esmu nobriedis priekš tāda pamatīgāka dzinēja uzcepšanas un arī ar smuko adrešu atbalstu. Tātad, labprāt dzirdētu kādus ieteikumus šinī sakarā.

Sistēma balstās uz vienu index.php failu, kurš atrodas saknes folderī, pārējie moduļi atrodas apakšfolderos un tiek iekļauti pēc vajadzības. Iespējams izmantot visas Apache iespējas. Acīmredzot par mod_rewrite būs daudz jāmācās <_<

 

Varētu lietot, piemēram, formātu http://somedomain/pageid/value1/value2/ tomēr reizēm vajadzīgs padot vairāk vai arī citādus parametrus, kā būtu ar šādu: http://somedomain/pageid/variablename1|value1/variablename2|value2/ - galvenais, kā uz to skatītos meklētāji? Uz kādiem simboliem viņi mēdz apstāties, kādus var droši lietot? Vai "|" ir drošs? It kā jau arī "=" var būt faila nosaukumā... Vai galvenais ir nelietot "?" ?

 

Par argumentu atdalītāju nolēmu izvēlēties ";" Vai tam ir arī kādi mīnusi? principā, minētaja piemērā tam kalpo arī "/"

Vai ir kāds veids, kā pārlūkam iestāstīt "&" vietā lietot citu? Tas attiecas uz formām ar GET metodi, kad tiek saformēts URL no formas laukiem, reizēm vajag arī tādas.

 

Vārdsakot, ja kādam ir pieredze, aicinu padalīties.

Link to comment
Share on other sites

Sveiks Andri.

Kad lasu tavu vārdu, neviļus nāk atmiņā tie laiki, kad valsti vadīja vīri vārdā Andris.

 

Bet mod_rewrite mācīšanos var atlikt uz tiem laikiem, kad ūpim asteskauls lūzīs. Sou tu vēlies būt tikpat kruts cik es:

 

http://www.42901.lv/articles/

http://www.42901.lv/articles/2003/

http://www.42901.lv/articles/2003/03/

http://www.42901.lv/articles/2003/03/dinam...l_pieprasijumi/

http://www.42901.lv/articles/php/

http://www.42901.lv/articles/php/dinamiski...l_pieprasijumi/

 

Tad pamatdirektorijā atliek .htaccess failā noteikt kādus failus papildus tradicionālajiem ar paplašinājumu .php vēlies parsēt ar PHP.

 

Ja tas ir fails articles, tad aiziet rakstam šādi:

<code><font color="#000000">

<Files articles> 
ForceType application/x-httpd-php 
</Files>
</font>
</code>

Ar šo te Apaches pamatkonfigurāciju pārjāšanu tu būsi pateicis, ka fails articles jāparsē ar PHP.

 

Kāpēc viss šis darbosies? Tāpēc, ka Apache ir tā uztaisīta, ka URL tiek parsēts no otra gala:

 

Ja galā ir kaut kāds www.andris_premjers.gov/superfails/andris/ tad tiek meklēta direktorija vārdā andris (zīmīgi, ka sakrīt ar tavu vārdu). Ja tā netiek atrasta, tad Apache skatās vai eksistē fails vārdā andris. Ja viņš to atrod (.. liec to savā vietā ... , atcerējos to dziesmu par bitēm, piedod), tad viņš dodas uz šo failu un aidā!

 

Ja tomēr Apache neatrod arī failu vārdā andris, kas ir visai iespējami (kurš gan tur uz servera failu vārdā Andris?), tad viņa (Apache, es par Apache runāju kā par sievieti, par PHP kā puisēnu un MySQL kā meiteni) dodas pa URLi uz labo pusi un meklē direktoriju vārdā superfails un darbojas pēc iepriekšaprakstītā scenārija gadījumam ar failu/direktoriju vārdā andris.

 

Ja tiek atrasts fails vārdā superfails (piemēra vienkāršības labad pieņemsim, ka tiek atrasts), tad viss, kas seko aiz superfails iekš URL ir ar PHP apstrādājams līdzīgi kā index.php?tema=Valdiba&vards=Andris&amats=premjers tikai šoreiz neviens tavā vietā 60 grādīgās slīpsvītras netulkos. Tāpēc izraugies kaut kādu gudru metodi, pēc kuras tiks analizēts pieprasījums un no skaistās virtenes atlasīts tas, ko domājis lietotājs.

 

Tā kā tuvojas svētki, bet man nav olu ko jums dāvāt, uzdāvāšu es savu URL parseri, kas viltīgi atļauj sasniegt rakstus gan pēc to tēmas, gan datuma:

 

(Šis ir fragments no kādas īpašas PHP klases, dodu svarīgākās funkcijas)

Link to comment
Share on other sites

Turpinājums iepriekšējam.

<code><font color="#000000">

	function initVars()
	{
		$this->year = 0;
		$this->month = 0;
		$this->topic = 0;
		$this->lapaname = 0;
		$this->pagenum = 0;			
	}

	function parseRequest()
	{
		$query = ereg_replace('^'.$_SERVER["SCRIPT_NAME"], '', $_SERVER["REQUEST_URI"]);
		$good_query = ereg_replace('?.+', '', $query);
		$init_req = explode('/',$good_query);
		$size = sizeof($init_req);
		$parsed_req = array();
		for ($i=0; $i<$size; $i++) {
			$item = array_shift($init_req);
			if ($item != '') {
				$parsed_req[] = $item;
			}
		}
		return $parsed_req;
	}

	function isYear($string)
	{
		$int = intval($string);
		if ($int>1969 && $int<=intval(date('Y'))) {
				return true;
		}
		return false;
	}

	function isMonth($string)
	{
		$int = intval($string);
		if ($int>0 && $int<13) {
			return true;
		}
		return false;
	}

	function isPage($string)
	{
		if (strlen($string)<4 && intval($string)>0) {
			return true;
		}
		return false;
	}

	function isLapaname($string)
	{
		if (eregi('^[a-zA-Z_]+$',$string) && strlen($string)<=30) {
			return true;
		}
		return false;
	}


	function analizeReq()
	{
	  switch (sizeof($this->req)) {
		  case 1: {
			  if ($this->isYear($this->req[0])) {
				  $this->year = $this->req[0];
			  } elseif ($this->isLapaname($this->req[0])) {
				  $this->topic = $this->req[0];
			  }
			  array_pop($this->req);
			  $this->analizeReq();
			  break;
		  }
		  case 2: {
			  if ($this->isMonth($this->req[1])) {
				  $this->month = $this->req[1];
			  } elseif ($this->isLapaname($this->req[1])) {
				  $this->lapaname = $this->req[1];
			  }
			  array_pop($this->req);
			  $this->analizeReq();
			  break;
		  }
		  case 3: {
			  if ($this->isLapaname($this->req[2])) {
				  $this->lapaname = $this->req[2];
			  } elseif ($this->isPage($this->req[2])) {
				  $this->pagenum = $this->req[2];
			  }
			  array_pop($this->req);
			  $this->analizeReq();
			  break;
		  }
		  case 4: {
			  if ($this->isPage($this->req[3])) {
				  $this->pagenum = $this->req[3];
			  }
			  array_pop($this->req);
			  $this->analizeReq();
			  break;
		  }
		  default: {
			  // URL analize done
		  }
	  }
	}
</font>
</code>

 

Tātad, kā jau teicu, šī ir Lieldienu dāvana, tāpēc izmantojiet kā gribat un kur gribat. Bez tam, ja jūs interesē atlikušais klases kods, prasiet personīgi pa e-pastu, jo lielajiem dūžiem diezin vai patiktos, ka es te visu savu ūdeni salieku.

 

Priecīgas Lieldienas!

Link to comment
Share on other sites

He, he, ar valsts vadītājiem gan man nav nekāda sakara :rolleyes: esmu vienkāršs programmētājs :P Bet paldies par Tavu atraktīvo komentāru!

Šis piemērs ar articles tā samērā plaši tika apspriests arī kaut kur iekš evolt.org, bet lieta tāda, ka es nevaru taisīt katram lapu veidam savu ierakstu iekš .htaccess un varbūt vēl likt kaut kādus failus direktorijās, jo man nav nekādu articles, bet lapu ID tiek ņemti no DB, kur ir reģistrētas visas lapas un to šabloni, tur nāk klāt visādi papildparametri, iekļaujamie moduļi utml. Līdz ar to, bez index.php nav nekādu citu speciālu failu, ko arī negribētu ieviest, jo ir doma sava darba atvieglošanai vēl uzmest web saskarni, caur ko tos šablonus rediģēt.

Laikam būs vietā jautājums, ko darīt, ja Tevis minētais superfails netiek atrasts?

Link to comment
Share on other sites

Bet zini, Andri, kopš uzdevi jautājumu tu attaisno cerības, kuras lieku uz visiem Andriem. Kā tur bija ar tiem, kas cer?

Sou we go and google a liitle bit. http://www.google.lv meklējam: "mod_rewrite+pretty+url php" un ko mēs atrodam?

Atrodam dzīvei jēgu!

Labākie rezultāti:

 

http://tavi.sourceforge.net/index.php?page...e=URL+Rewriting

http://photomatt.net/scripts/b2url

http://www.matthewgifford.com/2002/08/25/PrettyURLs

 

A izrādās nav nemaz tik grūti arī ar mod_rewrite...

 

Un vēl ir pasaulslavenais mod_rewrite ceļvedis: http://www.engelschall.com/pw/apache/rewriteguide/

Link to comment
Share on other sites

Ja godīgi, man nav ne jausmas, kādas ir Tavas cerības un priekšstati par maniem vārdabrāļiem :)

 

Bet, atgriežoties pie tēmas, biju jau uzdūries arī Tevis minētajam mod_rewrite ceļvedim. Tas ir skaidrs, ka tur atliek mācīties tik no ceļvežiem un dokumentācijas. Tas, protams, nav vienas dienas jautājums, jo man šie paņēmieni ir pilnīgi jauni, bet gan jau tās rules saknibināšu :).

Šobrīd mani galvenokārt interesē atbildes uz pašā sākumā uzdotajiem jautājumiem.

Link to comment
Share on other sites

Meklētājiem visvairāk patīk parastais 60 grādīgais svītrojums

un par to ||| vispār aizmirsti pēc iespējas ātrāk.

Daudzi meklētāji ? nemīl un neskatās URĻUS, kuros ir ?, bet tādu paliek arvien mazāk.

Par / viņi tā arī neuzzina kas tas ir - tas ir normāla "statiskā" URL atdarinājums.

Link to comment
Share on other sites

Informācijas izkārtojums principā ir reducējams uz topica pirmajā ziņojumā minēto formātu, par to viss būtu skaidrs, jo līdzīgā izpildījumā tas jau ir sevi pierādījis darbībā. Būs gadījumi, kad būs zināms konkrēts padodamo parametru skaits un secība, citreiz vajadzēs padot papildparametrus. Tas ir tikai kodols, kam var pieslēgt papildmoduļus pēc vajadzības, tam nav konkrēta viena specifiska pielietojuma.

 

Ok, par "?", "|" un "/" skaidrs. Atliek izvēlēties, kā atdalīt adresē mainīgā nosaukumu no vērtības. Varētu jau ar to pašu "/" un tad nolasīt pa pāriem, tomēr baidos, ka tukšas vērtības gadījumā, kad izveidotos kombinācija /variablename1//variablename2/value2 (value1 ir tukšs), kādam (browserim, webserverim, zirneklim vai jebkam citam) tas varētu nepatikt.

 

Kādēļ saki, ka "ir negudri" visu mest uz vienu index.php failu? Manā sistēmā viņš jau tik vien izveic kā iekļauj koplietošanas funkciju moduļus, pārbauda autorizāciju, nolasa konfigurāciju, lietotāja profilu un paskatās DB, ko darīt tālāk, kādi citi moduļi nepieciešami un kādas funkcijas jāizsauc utt. Daļa no "makan sarežģītajiem pieprasījumiem" glabājas kā papildparametri iekš DB speciālā lapu/šablonu reģistrā.

Protams, atsevišķos gadījumos var iztikt ar niecīgu atsevišķu php skriptiņu, to jau neviens nenoliedz, reizēm tiešām visu dzinēju darbināt var būt par smagu.

 

Tātad: runa šobrīd nav par to, kā uzrakstīt tādu vai citādu rewrite ruli tādēļ, ka tas ir kodēšanas nevis koncepcijas jautājums.

Link to comment
Share on other sites

×
×
  • Create New...