.htaccess GET-Variablen neu schreiben

Ich habe eine index.php, die alle Routing index.php behandelt? Seite = Controller (vereinfacht), nur um die Logik mit der Ansicht zu teilen.

Options +FollowSymlinks RewriteEngine on RewriteCond %{REQUEST_FILENAME} !-f RewriteCond %{REQUEST_FILENAME} !-d RewriteRule ^([\w\d~%.:_\-]+)$ index.php?page=$1 [NC] 

Was im Grunde: http: //localhost/index.php? Page = Controller To

http: // localhost / regler /

Kann mir jemand helfen, den Rewrite hinzuzufügen?

http: // localhost / controller / param / wert / param / wert (Und soforth)

Das wäre:

http: // localhost / controller /? param = Wert & Parameter = Wert

Ich kann es nicht mit der Schreibmaschine arbeiten.

Ein Controller könnte so aussehen:

   

Und auch:

   

   

Was die Leute zu sagen versuchen, ist, dass Sie eine Regel wie folgt schreiben können:

 RewriteRule ^(.*)$ index.php?params=$1 [NC] 

Dies wird deine eigentliche PHP-Datei so machen:

 index.php?params=param/value/param/value 

Und Ihre tatsächliche URL wäre wie folgt:

 http://url.com/params/param/value/param/value 

Und in Ihrer PHP-Datei können Sie auf Ihre Parameter zugreifen, indem Sie diese wie folgt explodieren lassen:

 < ?php $params = explode( "/", $_GET['params'] ); for($i = 0; $i < count($params); $i+=2) { echo $params[$i] ." has value: ". $params[$i+1] ."
"; } ?>

Ich denke, es ist besser, wenn Sie alle Anfragen auf die Datei index.php redirect und dann den Controller-Namen und andere Parameter mit PHP extrahieren. Genauso wie andere Frameworks wie Zend Framework.

Hier ist eine einfache class, die tun kann, wonach Sie suchen.

 class HttpRequest { /** * default controller class */ const CONTROLLER_CLASSNAME = 'Index'; /** * position of controller */ protected $controllerkey = 0; /** * site base url */ protected $baseUrl; /** * current controller class name */ protected $controllerClassName; /** * list of all parameters $_GET and $_POST */ protected $parameters; public function __construct() { // set defaults $this->controllerClassName = self::CONTROLLER_CLASSNAME; } public function setBaseUrl($url) { $this->baseUrl = $url; return $this; } public function setParameters($params) { $this->parameters = $params; return $this; } public function getParameters() { if ($this->parameters == null) { $this->parameters = array(); } return $this->parameters; } public function getControllerClassName() { return $this->controllerClassName; } /** * get value of $_GET or $_POST. $_POST override the same parameter in $_GET * * @param type $name * @param type $default * @param type $filter * @return type */ public function getParam($name, $default = null) { if (isset($this->parameters[$name])) { return $this->parameters[$name]; } return $default; } public function getRequestUri() { if (!isset($_SERVER['REQUEST_URI'])) { return ''; } $uri = $_SERVER['REQUEST_URI']; $uri = trim(str_replace($this->baseUrl, '', $uri), '/'); return $uri; } public function createRequest() { $uri = $this->getRequestUri(); // Uri parts $uriParts = explode('/', $uri); // if we are in index page if (!isset($uriParts[$this->controllerkey])) { return $this; } // format the controller class name $this->controllerClassName = $this->formatControllerName($uriParts[$this->controllerkey]); // remove controller name from uri unset($uriParts[$this->controllerkey]); // if there are no parameters left if (empty($uriParts)) { return $this; } // find and setup parameters starting from $_GET to $_POST $i = 0; $keyName = ''; foreach ($uriParts as $key => $value) { if ($i == 0) { $this->parameters[$value] = ''; $keyName = $value; $i = 1; } else { $this->parameters[$keyName] = $value; $i = 0; } } // now add $_POST data if ($_POST) { foreach ($_POST as $postKey => $postData) { $this->parameters[$postKey] = $postData; } } return $this; } /** * word seperator is '-' * convert the string from dash seperator to camel case * * @param type $unformatted * @return type */ protected function formatControllerName($unformatted) { if (strpos($unformatted, '-') !== false) { $formattedName = array_map('ucwords', explode('-', $unformatted)); $formattedName = join('', $formattedName); } else { // string is one word $formattedName = ucwords($unformatted); } // if the string starts with number if (is_numeric(substr($formattedName, 0, 1))) { $part = $part == $this->controllerkey ? 'controller' : 'action'; throw new Exception('Incorrect ' . $part . ' name "' . $formattedName . '".'); } return ltrim($formattedName, '_'); } } 

Wie man es benutzt:

 $request = new HttpRequest(); $request->setBaseUrl('/your/base/url/'); $request->createRequest(); echo $request->getControllerClassName(); // return controller name. Controller name separated by '-' is going to be converted to camel case. var_dump ($request->getParameters()); // print all other parameters $_GET & $_POST 

.htaccess Datei:

 RewriteEngine On RewriteCond %{REQUEST_FILENAME} -s [OR] RewriteCond %{REQUEST_FILENAME} -l [OR] RewriteCond %{REQUEST_FILENAME} -d RewriteRule ^.*$ - [NC,L] RewriteRule ^.*$ index.php [NC,L] 

Ihre Rewrite-Regel würde die gesamte URL übergeben:

 RewriteRule ^(.*)$ index.php?params=$1 [NC] 

Ihre index.php würde diesen vollständigen Pfad als controller / param / value / param / value für Sie interpretieren (mein PHP ist etwas eingerostet):

 $params = explode("/", $_GET['params']); if (count($params) % 2 != 1) die("Invalid path length!"); $controller = $params[0]; $my_params = array(); for ($i = 1; $i < count($params); $i += 2) { $my_params[$params[$i]] = $params[$i + 1]; } 

Wie wäre es mit der Umleitung zu index.php?params=param/value/param/value , und lasse php das ganze $_GET['params'] ? Ich denke, das ist der Weg, wie WordPress damit umgeht.

Ist das was du suchst?

Dieses Beispiel zeigt, wie Sie Abfragezeichenfolgenparameter mithilfe des Schleifenflags problemlos ausblenden können. Angenommen, Sie haben eine URL wie http://www.mysite.com/foo.asp?a=A&b=B&c=C und Sie möchten auf http://www.myhost.com/foo.asp/a/A zugreifen / b / B / c / C

Probieren Sie die folgende Regel aus, um das gewünschte Ergebnis zu erzielen:

RewriteRule ^(.*?\.php)/([^/]*)/([^/]*)(/.+)? $1$4?$2=$3 [NC,N,QSA]

Aus irgendeinem Grund funktionierte die gewählte Lösung nicht für mich. Es würde ständig nur “index.php” als Wert von params zurückgeben.

Nach einigem Versuch und Irrtum fand ich die folgenden Regeln, um gut zu funktionieren. Angenommen, Sie möchten, dass yoursite.com/somewhere/var1/var2/var3 auf yoursite.com/somewhere/index.php?params=var1/var2/var3 zeigt, dann legen Sie die folgende Regel in eine .htaccess-Datei im “irgendwo” Verzeichnis:

 Options +FollowSymLinks RewriteEngine On # The first 2 conditions may or may not be relevant for your needs # If the request is not for a valid file RewriteCond %{REQUEST_FILENAME} !-d # If the request is not for a valid directory RewriteCond %{REQUEST_FILENAME} !-f # This rule converts your flat link to a query RewriteRule ^(.*)$ index.php?params=$1 [L,NC,NE] 

Dann, in PHP oder der Sprache Ihrer Wahl, trennen Sie die Werte einfach mit dem explode-Befehl, wie von @Wesso gezeigt.

Zu Testzwecken sollte dies in der Datei index.php ausreichen:

 if (isset($_GET['params'])) { $params = explode( "/", $_GET['params'] ); print_r($params); exit("YUP!"); } 

Sind Sie sicher, dass Sie den Apache-Server verwenden, funktioniert .htaccess nur auf dem Apache-Server. Wenn Sie IIS verwenden, wird web.config benötigt. In diesem Fall:

 < ?xml version="1.0" encoding="UTF-8"?>