Apache mod_rewrite
Ce que vous recherchez est mod_rewrite ,
Description: fournit un moteur de réécriture basé sur des règles pour réécrire les URL demandées à la volée.
De manière générale, mod_rewrite
fonctionne en faisant correspondre le document demandé avec des expressions régulières spécifiées, puis effectue des réécritures d'URL en interne (dans le processus apache) ou en externe (dans le navigateur du client). Ces réécritures peuvent être aussi simples que la traduction interne de example.com/foo en une requête par exemple.com/foo/bar.
La documentation Apache comprend un mod_rewrite
guide et je pense que certaines des choses que vous voulez faire y sont couvertes. Guide mod_rewrite détaillé .
Forcer le www
sous - domaine
Je voudrais qu'il force "www" avant chaque URL, donc ce n'est pas domain.com mais www.domain.com/page
Le guide de réécriture comprend des instructions pour cela sous l' exemple de nom d' hôte canonique .
Supprimer les barres obliques (partie 1)
Je souhaite supprimer toutes les barres obliques de fin des pages
Je ne sais pas pourquoi vous voudriez faire cela car le guide de réécriture comprend un exemple pour l'exact opposé , c'est-à-dire, toujours avec une barre oblique de fin. La documentation suggère que la suppression de la barre oblique de fin a un grand potentiel de causer des problèmes:
Problème de barre oblique finale
La description:
Chaque webmaster peut chanter une chanson sur le problème de la barre oblique de fin sur les URL référençant des répertoires. S'ils sont manquants, le serveur renvoie une erreur, car si vous dites /~quux/foo
au lieu de, /~quux/foo/
le serveur recherche un fichier nommé foo. Et parce que ce fichier est un répertoire, il se plaint. En fait, il essaie de le réparer lui-même dans la plupart des cas, mais parfois ce mécanisme doit être émulé par vous. Par exemple, après avoir effectué de nombreuses réécritures d'URL complexes dans des scripts CGI, etc.
Peut-être pourriez-vous expliquer pourquoi vous souhaitez supprimer la barre oblique de fin tout le temps?
Supprimer l' .php
extension
J'en ai besoin pour supprimer le .php
La chose la plus proche de faire cela à laquelle je puisse penser est de réécrire en interne chaque document de demande avec une extension .php, c'est-à-dire que example.com/somepage est plutôt traité comme une demande pour example.com/somepage.php. Notez que procéder de cette manière exigerait que chaque page existe réellement en tant que somepage.php sur le système de fichiers.
Avec la bonne combinaison d'expressions régulières, cela devrait être possible dans une certaine mesure. Cependant, je peux prévoir certains problèmes possibles avec les pages d'index qui ne sont pas demandées correctement et ne correspondent pas correctement aux répertoires.
Par exemple, cela réécrira correctement example.com/test en tant que requête pour example.com/test.php:
RewriteEngine on
RewriteRule ^(.*)$ $1.php
Mais cela fera échouer le chargement de example.com car il n'y a pas d'exemple.com/.php
Je vais deviner que si vous supprimez toutes les barres obliques de fin, alors choisir une demande d'index de répertoire à partir d'une demande de nom de fichier dans le répertoire parent deviendra presque impossible. Comment déterminer une demande pour le répertoire 'foobar':
example.com/foobar
à partir d'une requête pour un fichier appelé foobar (qui est en fait foobar.php)
example.com/foobar
Cela pourrait être possible si vous utilisiez la RewriteBase
directive. Mais si vous faites cela, ce problème devient beaucoup plus compliqué car vous allez avoir besoin de RewriteCond
directives pour vérifier au niveau du système de fichiers si la demande correspond à un répertoire ou à un fichier.
Cela dit, si vous supprimez votre obligation de supprimer toutes les barres obliques de fin et que vous forcez à la place d'ajouter des barres obliques de fin, le problème «sans extension .php» devient un peu plus raisonnable.
# Turn on the rewrite engine
RewriteEngine on
# If the request doesn't end in .php (Case insensitive) continue processing rules
RewriteCond %{REQUEST_URI} !\.php$ [NC]
# If the request doesn't end in a slash continue processing the rules
RewriteCond %{REQUEST_URI} [^/]$
# Rewrite the request with a .php extension. L means this is the 'Last' rule
RewriteRule ^(.*)$ $1.php [L]
Ce n'est toujours pas parfait - chaque demande de fichier a toujours .php ajouté à la demande en interne. Une demande de 'hi.txt' placera ceci dans vos journaux d'erreurs:
[Tue Oct 26 18:12:52 2010] [error] [client 71.61.190.56] script '/var/www/test.peopleareducks.com/rewrite/hi.txt.php' not found or unable to stat
Mais il existe une autre option, définissez les directives DefaultType
et DirectoryIndex
comme ceci:
DefaultType application/x-httpd-php
DirectoryIndex index.php index.html
Mise à jour 2013-11-14 - Correction de l'extrait ci-dessus pour incorporer l'observation de Nicorellius
Désormais, les requêtes pour hi.txt (et toute autre chose) réussissent, les requêtes adressées à example.com/test renverront la version traitée de test.php et les fichiers index.php fonctionneront à nouveau.
Je dois donner le crédit où le crédit est dû pour cette solution car je l'ai trouvée Michael J. Radwins Blog en recherchant Google pour php sans extension apache .
Supprimer les barres obliques de fin
Certaines recherches apache remove trailing slashes
m'ont amené à certaines pages d'optimisation des moteurs de recherche. Apparemment, certains systèmes de gestion de contenu (Drupal dans ce cas) rendront le contenu disponible avec et sans barre oblique finale dans URls, ce qui dans le monde du référencement entraînera une pénalité de contenu en double pour votre site. La source
La solution semble assez triviale, en utilisant mod_rewrite
on réécrit à condition que la ressource demandée se termine par un /
et réécrive l'URL en renvoyant l' 301 Permanent Redirect
en-tête HTTP.
Voici son exemple qui suppose que votre domaine est blamcast.net et permet à la requête d'être éventuellement préfixée avec www.
.
#get rid of trailing slashes
RewriteCond %{HTTP_HOST} ^(www.)?blamcast\.net$ [NC]
RewriteRule ^(.+)/$ http://%{HTTP_HOST}/$1 [R=301,L]
Maintenant, nous arrivons quelque part. Permet de tout mettre ensemble et de voir à quoi il ressemble.
Obligatoire www.
, non .php
et pas de barres obliques de fin
Cela suppose que le domaine est foobar.com et qu'il fonctionne sur le port standard 80.
# Process all files as PHP by default
DefaultType application/x-httpd-php
# Fix sub-directory requests by allowing 'index' as a DirectoryIndex value
DirectoryIndex index index.html
# Force the domain to load with the www subdomain prefix
# If the request doesn't start with www...
RewriteCond %{HTTP_HOST} !^www\.foobar\.com [NC]
# And the site name isn't empty
RewriteCond %{HTTP_HOST} !^$
# Finally rewrite the request: end of rules, don't escape the output, and force a 301 redirect
RewriteRule ^/?(.*) http://www.foobar.com/$1 [L,R,NE]
#get rid of trailing slashes
RewriteCond %{HTTP_HOST} ^(www.)?foobar\.com$ [NC]
RewriteRule ^(.+)/$ http://%{HTTP_HOST}/$1 [R=301,L]
L'indicateur 'R' est décrit dans la RewriteRule
section directive. Fragment:
redirect|R [=code]
(forcer la redirection) Substitution de préfixe avec
http://thishost[:thisport]/
(qui fait de la nouvelle URL un URI) pour forcer une redirection externe. Si aucun code n'est donné, une réponse HTTP de 302 ( MOVED TEMPORARILY ) sera renvoyée.
Note finale
Je n'ai pas réussi à faire fonctionner la suppression de la barre oblique. La redirection a fini par me donner des boucles de redirection infinies. Après avoir lu de plus près la solution originale, j'ai l'impression que l'exemple ci-dessus fonctionne pour eux en raison de la configuration de leur installation Drupal. Il mentionne spécifiquement:
Sur un site Drupal normal, avec des URL propres activées, ces deux adresses sont fondamentalement interchangeables
En référence aux URL se terminant par et sans barre oblique. En outre,
Drupal utilise un fichier appelé .htaccess
pour indiquer à votre serveur Web comment gérer les URL. C'est le même fichier qui active la magie des URL propres de Drupal. En ajoutant une simple commande de redirection au début de votre
.htaccess
fichier, vous pouvez forcer le serveur à supprimer automatiquement les barres obliques de fin.