mod_rewrite avec plusieurs chaînes de requête?

J’essaie de nettoyer certaines URL sur mon blog, j’ai donc décidé de me pencher sur mod_rewrite. Je n’ai pas la moindre idée de ce que je fais, alors j’espérais pouvoir obtenir de l’aide: PI a des liens comme http://kn3rdmeister.com/blog/post.php?y=2012&m=07&d=04&id=4 . Bien que cela fonctionne, et que les utilisateurs obtiennent toujours le contenu que je veux, je n’aime pas qu’ils aient à regarder toutes les chaînes de requête. Je veux activer le lien ci-dessus dans http://kn3rdmeister.com/blog/2012/07/04/4.php .

Voici à quoi ressemble mon .htaccess en ce moment.

 RewriteEngine On RewriteCond %{QUERY_STRING} ^y=([0-9){4})&m=([0-9]{2})&d=([0-9]{2})&id=([0-9]*)$ RewriteRule ^/blog/post\.php$ http://kn3rdmeister.com/blog/%1/%2/%3/%4.php? [L] 

Comme je l’ai dit, je ne sais absolument rien: D

Si vous utilisez apache 2.0 ou supérieur, vous devrez supprimer la barre oblique (le préfixe) si ces règles sont dans un fichier .htaccess, de sorte que votre expression régulière ressemble à ceci:

 # also note this needs to be a "]"--v RewriteCond %{QUERY_STRING} ^y=([0-9]{4})&m=([0-9]{2})&d=([0-9]{2})&id=([0-9]*)$ RewriteRule ^blog/post\.php$ http://kn3rdmeister.com/blog/%1/%2/%3/%4.php? [L] 

Cela va faire en sorte que quand quelqu’un met http://kn3rdmeister.com/blog/post.php?y=2012&m=07&d=04&id=4 dans la barre d’adresse de son navigateur, son navigateur sera redirigé vers http://kn3rdmeister.com/blog/2012/07/04/4.php et la nouvelle URL apparaîtra dans leur barre d’adresse.

Je suppose que vous avez quelque chose de configuré sur votre serveur pour gérer une requête comme le blog/2012/07/04/4.php .

Au début, vous devez définir vos URL!

Comme:

/blog montre la front page

/blog/1234 montre post 1234

/blog/date/2012 affiche les posts by year

/blog/date/2012/06 affiche les posts by year and month

/blog/date/2012/06/01 affiche les posts by year and month and day

etc…

La première option consiste à réécrire chaque URL définie dans index.php. Votre index.php doit seulement gérer les parameters GET soumis.

 ### Do only if rewrite is installed  ### Start rewrite and set basedir RewriteEngine on RewriteBase / ### Rewrite only if no file link or dir exists RewriteCond %{REQUEST_FILENAME} !-f RewriteCond %{REQUEST_FILENAME} !-d RewriteCond %{REQUEST_FILENAME} !-l ### Rewrite frontpage RewriteRule ^blog$ /index.php?action=showfront [L,QSA] ### Rewrite post RewriteRule ^blog/([0-9]+)$ /index.php?action=showpost_by_id&id=$1 [L,QSA] ### Rewrite posts by date RewriteRule ^blog/date/([0-9]{4})$ /index.php?action=showposts_by_date&year=$1 [L,QSA] RewriteRule ^blog/date/([0-9]{4})/([0-9]{2})$ /index.php?action=showposts_by_date&year=$1&month=$2 [L,QSA] RewriteRule ^blog/date/([0-9]{4})/([0-9]{2})/([0-9]{2})$ /index.php?action=showposts_by_date&year=$1&month=$2&day=$3 [L,QSA] ### Rewrite posts by tag RewriteRule ^blog/tag/([a-zA-Z0-9_-]+)$ /index.php?action=showposts_by_tag&tag=$1 [L,QSA]  

Tester dans index.php avec: print_r ($ _ GET); print_r ($ _ POST);

La deuxième option consiste à réécrire toutes les URL et votre index.php doit gérer toutes les URL possibles. Donc, au début, il a besoin de quelque chose comme un routeur qui divise l’URL entrante en plusieurs parties, puis envoie la page demandée ou une page d’erreur. Je voudrais essayer au début comme l’école sanglante.

  RewriteEngine on RewriteBase / RewriteCond %{REQUEST_FILENAME} !-f RewriteCond %{REQUEST_FILENAME} !-d RewriteCond %{REQUEST_FILENAME} !-l RewriteRule ^ index.php%{REQUEST_URI} [L]  

Tester dans index.php avec:

 print_r(explode('/', lsortingm($_SERVER['PATH_INFO'], '/'))); print_r($_GET); print_r($_POST); 

La troisième option consiste à utiliser un framework PHP. Un framework peut vous aider à écrire votre code assez rapidement. Il vous fournit de nombreuses classes de base comme un routeur. (par exemple ZendFramework, Flow3, Kohana, Symfony, CodeIgniter, CakePHP, yii et autres). Cela vous rendra plus avancé.

La quasortingème option, la plus paresseuse, consiste à utiliser un logiciel prêt à l’emploi comme WordPress.