J'essaie de mettre à jour/créer un fichier .htaccess pour mon serveur Apache2 afin que mes pages Web soient accessibles sans extensions de fichier (par exemple, www.example.com/whatis.php est désormais accessible sous www.example.com/whatis/). . J'ai essayé de suivre les instructions sur l'édition de .htaccess et maintenant je crée un .htaccess ici:
/etc/Apache2/sites-available/.htaccess
J'ai essayé de lire sur les fichiers .htaccess ici: http://httpd.Apache.org/docs/2.2/howto/htaccess.htmlhttp://wiki.Apache.org/ httpd/Htaccess
Mais je n'ai pas trouvé la documentation utile. Si j'ai bien compris, je dois mettre un fichier nommé ".htaccess" à chaque niveau/répertoire où je veux donner des instructions spécifiques au serveur. Donc, comme je veux que le serveur coupe l’extension .php de tous les fichiers, j’ai créé le fichier .htaccess à l’emplacement ci-dessus et y ai placé ceci:
RewriteEngine on
RewriteRule ^([^/\.]+)/?$ $1.php [L]
Cependant, même après le redémarrage de mon serveur Apache2, je ne peux toujours pas raccourcir le chemin. Si j'essaie de charger le chemin sans le .php, la page n'est pas trouvée. Je suppose que le problème vient de mon fichier .htaccess plutôt que du code.
Si longue histoire, où devrais-je mettre mon fichier .htaccess et comment fonctionnent-ils en général? Si une ressource recommandée existe, je suis intéressé. Je vous remercie.
Un fichier .htaccess dans chaque sous-dossier est utilisé pour chaque URL et le fichier .htaccess le plus proche de l'URL est prioritaire lorsque deux fichiers htaccess donnent des instructions différentes.
Exemple:
Par exemple, exemple.com/dir1/dir2/page.html, les fichiers .htaccess de example.com/, dir/et dir2/all sont utilisés et le fichier .htaccess de dir2 remplace tous les conflits entre les fichiers .htaccess de dir1 et dir2.
S'il n'y a pas de fichier .htaccess dans un répertoire spécifique, c'est bien. Les autres fichiers .htaccess disponibles seront utilisés.
Par exemple, cela permet au fichier .htaccess de votre répertoire racine de bloquer les adresses IP de toutes les URL de votre site. Et vous pouvez créer des règles personnalisées dans des sous-répertoires spécifiques que vous ne souhaitez pas utiliser pour d'autres sous-répertoires de votre site.
Voici un exemple pour afficher exemple.com/page à la place exemple.com/page.php:
#remove php file extension
#https://example.com/file.php will become https://example.com/file
RewriteEngine on
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME}\.php -f
RewriteRule ^(.*)$ $1.php [NC,L]
exemple.com/page au lieu exemple.com/page.html
#remove html file extension
#https://example.com/file.html will become https://example.com/file
RewriteEngine on
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME}\.html -f
RewriteRule ^(.*)$ $1.html [NC,L]
Après avoir implémenté le code htaccess ci-dessus, s'il existe des répertoires sur le site qui ont encore les extensions .php et .html, essayez également d'implémenter le code htaccess ci-dessus dans le fichier .htaccess du répertoire dans lequel cela se produit. Le fichier .htaccess de ce répertoire doit avoir priorité sur les fichiers .htaccess plus proches de votre racine.
Il est également intéressant de noter que les fichiers .htaccess fonctionnent chronologiquement, ce qui signifie que les lignes de code figurant plus loin dans un fichier .htaccess remplacent les lignes de code écrites précédemment. Ainsi, si vous rencontrez des problèmes lors de la suppression des extensions .php et .html, il vaut la peine d'essayer de placer ce code au bas de votre fichier .htaccess au cas où il y aurait un autre code en conflit avec celui-ci.
Les utilisateurs qui rencontrent des difficultés pour supprimer les extensions .php et .html sur Wordpress doivent essayer de mettre le code .htaccess ci-dessus après les lignes # BEGIN WordPress # END WordPress
.
Dans votre définition de <VirtualHost ...>
, vous avez une DocumentRoot
.
Par exemple, supposons que vous créez un site Web example.com
et placez ce site Web sous:
/var/www/example.com/public_html/
Votre <VirtualHost ...>
ressemblerait à quelque chose comme:
<VirtualHost *:80>
ServerAdmin [email protected]
DocumentRoot /var/www/example.com/public_html/
ServerName example.com
... # other descriptions
</VirtualHost>
Tout d'abord, vous pouvez avoir un .htaccess
sous /var/www/example.com/public_html/
. Cela s'appelle votre dossier racine.
Tout sous-dossier que vous avez sous ce dossier racine peut également inclure son propre .htaccess
. Un sous-dossier .htaccess
a priorité sur le dossier racine ou n’importe quel dossier parent.
Par exemple, Drupal a un .htaccess
dans son dossier files
afin d'empêcher quiconque d'exécuter le code PHP dans ce dossier. Ce dossier files
est l'endroit où vous pouvez télécharger des fichiers à partir du frontal Drupal. En d'autres termes, vous pouvez télécharger un fichier .php, puis essayer de l'exécuter. Avec ce .htaccess
, ils empêchent la possibilité d’une telle exécution. La commande qu'ils utilisent est:
php_flag engine off
Les fichiers de configuration /etc/Apache2/sites-available/*.conf
, quant à eux, incluent des commandes similaires à celles que vous avez placées dans le .htaccess
. Par conséquent, aucun .htaccess
ne figure sous /etc/Apache2/...
.
La différence est que vous utilisez la directive <Directory ...>
pour ajuster les drapeaux. Pour cet exemple Drupal, vous utiliseriez:
<Directory "/var/www/example.com/public_html/sites/default/files">
php_flag engine off
</Directory>
Cela permet de réaliser exactement le même exploit que le fichier .htaccess
et sera dans la plupart des cas beaucoup plus rapide.
Le .htaccess
est excellent sur un système comme GoDaddy ou Bluehost lorsque vous bénéficiez d'un hébergement partagé. Cela est utile car vous n'avez pas d'accès direct aux fichiers /etc/Apache2
. Sinon, désactiver cette fonctionnalité accélérera les choses car Apache n'aura pas à vérifier s'il existe un fichier .htaccess
. Pour l'exemple de fichiers ci-dessus, cela signifie qu'il faut vérifier les répertoires suivants:
/var/www/example.com/public_html/sites/default/files
/var/www/example.com/public_html/sites/default
/var/www/example.com/public_html/sites
/var/www/example.com/public_html
Le premier .htaccess
est utilisé de sorte que, dans ce cas particulier, il s’arrête au premier répertoire. Si vous avez plusieurs sous-répertoires et que la plupart d'entre eux ne possèdent pas de .htaccess
, tous ces problèmes seront examinés à maintes reprises. Donc, ne pas utiliser ces fichiers (et désactiver la fonction dans vos paramètres /etc/Apache2/...
) va sauver votre serveur de nombreux cycles.
Enfin, pour répondre à votre question sur la manière dont vous exécutez habituellement un fichier .php lorsque vous souhaitez que l'utilisateur entre simplement un chemin normal sans le .php, vous utilisez un index.php (dans la plupart des cas, vous pouvez vraiment nommer ce fichier vous voulez) et à partir de là, vous exécutez le code nécessaire en utilisant divers include/require, etc. Si votre code est simple, un simple besoin suffira.
Le code Apache ressemblerait à ceci:
<Directory "/var/www/example.com/public_html">
DirectoryIndex index.php
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)$ index.php?q=$1 [L,QSA]
</Directory>
Cela signifie qu'il faut exécuter index.php
en plaçant le chemin dans la chaîne de requête q
. (Ceci est le moyen Drupal, vous n'avez pas réellement besoin de la chaîne de requête.) Personnellement, j'ai utilisé ce qui suit:
<Directory "/var/www/example.com/public_html">
DirectoryIndex index.php
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)$ /index.php [last,passthrough,qsappend]
</Directory>
Mais cela peut ne pas fonctionner sur votre système en fonction des autres paramètres de votre serveur Apache2.
Dans votre index.php, vous obtiendrez un chemin en tant que paramètre REQUEST_URI:
$pos = strpos($_SERVER["REQUEST_URI"], '?');
if($pos === FALSE)
{
$path = $_SERVER["REQUEST_URI"];
}
else
{
// remove the query string if present
//
$path = substr($_SERVER["REQUEST_URI"], 0, $pos);
}
Maintenant vous avez un chemin et vous pouvez exécuter le code correspondant:
require $path . ".php";
Cependant, je vous recommande fortement de vérifier le contenu de $path
car il peut être fortement altéré. Tout d'abord, si le fichier n'existe pas, vous souhaitez renvoyer un 404:
$php = $path . ".php";
if(!file_exists($php))
{
http_response_code(404);
echo "<h1>Page Not Found</h1><p>Sorry Could Not Find Your Page...</p>";
}
switch($path)
{
case 'this-path-is-allowed':
case 'and/it/works/with/sub-paths':
require $php;
break;
default:
// emit another error, maybe a 403 or 500?
http_response_code(403);
echo "<h1>Page Not Accessible</h1><p>Sorry Not Authorized Here.</p>";
break;
}
Comme on peut le constater, on peut ainsi éviter le .php
et mieux contrôler ce qui est exécuté et ce qui ne fonctionne pas. De cette façon, vous pouvez avoir plusieurs fichiers .php, mais ne permettre que quelques-uns d’être exécutés comme prévu (bien que placer ceux qui ne devraient jamais être directement accessibles par Apache en dehors du répertoire racine est bien plus intelligent, mais pas toujours réalisable selon votre hôte. ou le CMS que vous utilisez.)
Une autre façon, même si je n’ai jamais essayé, serait de vérifier si le fichier .php existe et, le cas échéant, de réécrire le chemin:
RewriteCond %{REQUEST_FILENAME}.php !-f
RewriteRule ^(.*)$ /$1.php [last,passthrough,qsappend]
Évidemment, tout fichier .php de votre répertoire sera alors exécutable à partir du serveur principal. Quelque chose à garder à l'esprit. Lorsque j'écris mon propre code PHP, cependant, je ne place que des fichiers publics dans le répertoire racine et en-dessous, ce qui ne me pose pas de problème. C'est pourquoi j'ai un sous-répertoire public_html
. Mes autres fichiers PHP seront généralement placés dans un répertoire séparé php
:
/var/www/example.com/php -- server side only PHP files
/var/www/example.com/public_html -- public PHP, image, CSS, JS... files
Tout ce qui se trouve dans /var/www/example.com/php
peut être inclus à partir du fichier PHP qui se trouve sous /var/www/example.com/public_html
, mais le client n'a pas accès à ces fichiers. Beaucoup plus sûr que WordPress, Drupal, etc. (et pourtant, ils dominent le monde?!)
Un autre aspect important de cela. Si vous laissez l'utilisateur accéder au fichier de toute façon, avec le .php et sans (ce que certains de mes codes ci-dessus peuvent faire), alors vous devriez également mettre une balise méta canonique dans vos pages car sinon Google verra la duplication et les sourcils froncés il.
Vous devez placer le fichier .htacess dans/var/www/html. Si vous n'avez pas de dossier html, placez-le dans le répertoire www.
Avant cela, vous devez modifier d'autres configurations. Puisque vous devez activer la réécriture d'URL, vous devez d'abord l'activer. Cela peut être fait avec la commande suivante.
Sudo a2enmod rewrite
Ensuite, vous devriez changer le fichier de configuration par défaut Apache. Ouvrez ce fichier en entrantSudo nano /etc/Apache2/sites-available/default
.
Une fois dans ce fichier, recherchez la section suivante et modifiez la ligne indiquant AllowOverride de Aucun à Tous. La section devrait maintenant ressembler à ceci:
<Directory /var/www/>
Options Indexes FollowSymLinks MultiViews
AllowOverride All
Order allow,deny
allow from all
</Directory>
Une fois cette opération terminée, redémarrez le serveur Apache à l'aide de la commande suivante.
Sudo service Apache2 restart
Cela devrait faire le travail.