URL umschreiben mit mod_rewrite & PHP

ben78

Mitglied
Hi Leute,

ich will meine LInkstruktur umbauen. Dazu habe ich folgenden Ansatz aufgearbeitet:
PHP:
	//VARS
	$path_parts = pathinfo($_SERVER['PHP_SELF']); 
	$pfadangabe = $path_parts['dirname']."/".$path_parts['filename'];

	//LINK
	<a href=\"".htmlspecialchars($pfadangabe"/".$var1."/".$var2."/".$var3)";

Hierzu meine .htaccess
Code:
	RewriteRule ^unterseite/(.*)/(.*)/(.*).html$ /unterseite.html?param1=$1t&param2=$2&param3=$3 [QSA]

Dabei entstehen folgende 2 Probleme:
1. Problem
Die URL wird wie folgt ohne DOMAIN.DE angezeigt
Code:
	http://unterseite/$var1//$var3.html
Ich schließe daraus, dass irgendwo hier der Fehler liegen muss:
PHP:
	$path_parts = pathinfo($_SERVER['PHP_SELF']); 
	$pfadangabe = $path_parts['dirname']."/".$path_parts['filename'];//=>HIER MUSS DER FEHLER LIEGEN

2. Problem
Wenn eine $var nicht gegeben ist, dann entstehen in der URL doppelslashes wie z. B.:
Code:
unterseite/$var1//$var3.html)

Dieses Problem habe ich mittels If-Anweisung lösen können. Also so in etwa:
PHP:
$slashes_1 ="/";
$slashes_2 = "/";

if ( $var1=='' ) $slashes_1='';
if ( $var2=='' ) $slashes_2='';
So verschwinden jetzt wenigstens die Doppelslashes...
Aber meine Frage an der Stelle lautet, ob das rein technisch überhaupt der richtige Ansatz ist****?

FAZIT:
Ich bin mir Sicher, dass der Schweinehund irgendwo in der .htaccess und in der Variable "$pfadangabe" zu finden ist...

Jemand ne Ahnung, der weiterhelfen kann****?
 
Ich habe nicht richtig verstanden, was du überhaupt erreichen willst.

Ich kenn dieses Routing nur so, dass man eine index.php hat, auf die man alle Anfragen umleitet und den eigentlich eingegebenen Pfad als query-string übergibt. So deutet deine .htaccess das ja auch an.
Diese zentrale index.php interpretiert den query-string und included dann vereinfacht gesagt die gewünschte Unterseite.

Bitte erkläre doch nochmal genauer, was du vor hast. Ich kann auch nicht genau erkennen, in welchem kontext dein Code steht.

Aber wenn ich dich zumindest soweit richtig verstanden habe, dann ist mir dein Einsatz von pathinfo() nicht klar. pathinfo zerlegt einen String in bestimmte einzelne Teile.
Und zwar Ordner-Pfandangaben und nicht URLs.

Wenn Du eine URL in einzelne Teile zerlegen möchtest, würde ich parse_url empfehlen.

Außerdem von php.net:
$_SERVER['PHP_SELF']
Der Dateiname des aktuell ausgeführten Skripts, relativ zum Document Root. Beispielsweise enthält $_SERVER['PHP_SELF'] in einem Skript, das über die Adresse http://example.com/test.php/foo.bar aufgerufen wird, den Wert /test.php/foo.bar/.

Dass also die Domain mit Suffix nicht in der $pfadangabe drin ist, hat also IMHO drei Gründe:
  1. $_SERVER['PHP_SELF'] enthält diese Angabe schon nicht
  2. pathinfo ist für Ordner-Pfade und nicht für URLs gedacht
  3. Selbst wenn, bei der Zusammensetzung der $pfadangabe würde dieser Teil eh nicht berücksichtigt
 
Hey...Du hast mich genau richtig verstanden. Die Variante mit der index.php ist genau die, welche ich will. Ich poste gleich mehr Code für den Überblick...
 
Hier mal der Code bis zur Abfrage****?
PHP:
if(isset($_GET['param1'])){ 
    $params = explode("_", $_GET['param1']); 
    $param1 = $params[0]; 
    if($params[1] != "" && $params[1] != "asc" && $params[1] != "desc"){ 
        $param4 = $params[1]; 
    } 
     
    if($params[1] == "asc" || $params[2] == "asc"){ 
        // Ascending 
    } else { 
        // Descending 
    } 
} 

$var1 = (empty($var1) AND isset($param1)) ? trim($param1) : 'Wert,Wert,Wert...'; 
$var2 = (empty($var2) AND isset($_GET['param2'])) ? trim($_GET['param2']) : ''; 



$var1 = (isset($_POST['param1']) AND $_POST['param1'] != 'irgendwas') ? trim($_POST['param1']) : $var1; 
$var2 = isset($_POST['param2']) ? trim($_POST['param2']) : $var2; 

$path_parts = pathinfo($_SERVER['PHP_SELF']); 
$var3 = $path_parts['dirname']."/".$path_parts['filename']; 




//ABFRAGE...SELECT...etc.

Und hier der Link.
PHP:
$var15 = "<a href=\"".htmlspecialchars($pfadangabe."./".$VAR1."/".$VAR2."/".$VAR3)."; 
                            if(isset($_GET['param4'])) $var15 .= "_".$_GET["param4"]; 
                            if(isset($_GET['param5'])) $var15 .= "_asc"; 
                            elseif(isset($_GET['param6'])) $var15 .="_desc"; 
     $var15 .= ".html\" title=\"Vor\"><font class=\"no_bg\"> &raquo;&raquo;</font></a> \n"; 
     $var10[] = $var15;

Ich würde gerne wissen wie ich es zustande bringen kann, dass alle Anfragen auf die index.php umgeleitet werden...Handelt es sich hierbei um einen 301er in der .htaccess****?...ich glaube mal nicht oder?
 
Hi,

das "Umleiten" geschieht über mod_rewrite (im Apache).
Code:
RewriteEngine On

# Bedingung: Die angeforderte Datei befindet sich im Dateisystem:
RewriteCond %{REQUEST_FILENAME} -s [OR]
RewriteCond %{REQUEST_FILENAME} -l [OR]
RewriteCond %{REQUEST_FILENAME} -d

# Wenn Bedingung erfüllt, dann nicht umschreiben und Datei ausliefern.
RewriteRule ^.*$ - [NC,L]

# Wenn Bedingung nicht erfüllt, dann URL umschreiben und an die index.php übergeben.
RewriteRule ^.*$ index.php [NC,L]

Gruß Kyoya Stefan
 
Zuletzt bearbeitet:
Dann im Script bekommst du den Teil hinter der Domain mit Suffix wie folgt:
PHP:
// http://www.blabla.de/unterseite/param1/param2

$querystring = $_SERVER['REQUEST_URI'];

echo $querystring; // gibt aus: "/unterseite/param1/param2"

Und diesen String kann man dann auch mit pathinfo zerlegen, aber auch einfach mit explode, interpretieren und dementsprechende Dinge tun.
 
Zuletzt bearbeitet:
.htaccess verwirrt mich ohne Ende
Dann im Script bekommst du den Teil hinter der Domain mit Suffix wie folgt:
PHP-Code:
// http://www.blabla.de/unterseite/param1/param2

$querystring = $_SERVER['REQUEST_URI'];

echo $querystring; // gibt aus: "/unterseite/param1/param2"
werd ich gleich mal umsetzen...

Hey Leute...ich gebe Euch gleich einen Report...Langsam haut's hin aber noch nicht ganz...

Ich bekomm's nicht hin

So schaut jetzt meine .htaccess aus wie von Kyôya gepostet...Nochmals Danke an der Stelle:
Code:
# Bedingung: Die angeforderte Datei befindet sich im Dateisystem:
RewriteCond %{REQUEST_FILENAME} -s [OR]
RewriteCond %{REQUEST_FILENAME} -l [OR]
RewriteCond %{REQUEST_FILENAME} -d
 
# Wenn Bedingung erfüllt, dann nicht umschreiben und Datei ausliefern.
RewriteRule ^.*$ - [NC,L]
 
# Wenn Bedingung nicht erfüllt, dann URL umschreiben und an die index.php übergeben.
RewriteRule ^.*$ index.php [NC,L]

meine index.php ist vorhanden aber eine Umleitung findet nicht statt, sobald ich den Link betätige. Ich werde das ganze jetzt nochmal von vorne durcharbeiten...ich hoffe ihr könnt mir weiterhelfen...wäre echt super von Euch...******

Leute, die Geschichte mit der index.php hab ich jetzt hinbekommen. Also bei jedem Klick auf den Link gelangt man nun zur index.php und alle Funktionen lassen sich dort einwandfrei ausführen. Das ganze hab ich jetzt ausschließlich mittels PHP realisiert und erstmal komplett auf .htaccess verzichtet...

Aber das ich nicht um die .htaccess herumkommen wenn ich die URL's in gewünschte Form bringen will, weiss ich selbst. Ich geh jetzt erstmal schlafen und melde mich dann wieder, wenn ich mit der .htaccess rummache...Aber erstmal vielen Dank an der Stelle für Eure Hilfe Jungs...
 
Zuletzt bearbeitet von einem Moderator:
Hier mal ein Ansatz, den ich gestern noch geschrieben habe:

PHP:
/***********/
/* Routing */
/***********/
$request = $_SERVER['REQUEST_URI'];

$request_parts = explode('/',$request);

//filter empty elements
$request_parts = array_filter($request_parts);

//reset keys
$request_parts = array_merge($request_parts);

$request_parts_count = count($request_parts);

$current_part = 0;

//Language - if it's not one of the languages
// defined in the $CONFIG->get('languages') array,
// redirect to this request with default language
$language_name = $CONFIG->get('defaultLanguage');
if($request_parts_count > $current_part && in_array($request_parts[$current_part],$CONFIG->get('languages'))){
	$language_name = $request_parts[$current_part];
	$current_part++;
}
else{
	header('Location: '.$CONFIG->get('defaultLanguage').$request);
}


//Controller
$controller_name = $CONFIG->get('defaultController');
if($request_parts_count > $current_part){
	$controller_name = $request_parts[$current_part];
	$current_part++;
}

//Action
$action_name = $CONFIG->get('defaultAction');
if($request_parts_count > $current_part){
	$action_name = $request_parts[$current_part];
	$current_part++;
}

//Parameters
$parameters = array();
if($request_parts_count > $current_part){
	$i=0;
	foreach($request_parts as $part){
		if($i<3){
			$i++;
			continue;
		}else{
			//Try to split the parameter
			$param_parts = explode(':',$part);
			if(count($param_parts) > 1)
				$parameters[$param_parts[0]] = $param_parts[1];
			else {
				$parameters[] = $part;
			}
		}
	}
}
Das ganze hat dann folgenden Effekt:
PHP:
// http://www.blabla.de/en/controller1/action1/parameter1/parameter2:wert2/parameter3
$language_name; //en
$controller_name; //controller1
$action_name; //action1
$parameter[0]; //parameter1
$parameter['parameter2']; //wert2
$parameter[2]; //parameter3
Das ganze Arbeitet mit einem $CONFIG Objekt. Das müsste man dann entsprechend Anpassen.
Dort sind z.B. default Controller und Actions definiert, Standardsprache etc.
Vielleicht hilft Dir das ja.
 
Zurück