Refuser l'accès direct aux fichiers ou de répertoire à l'aide .htaccess
Je suis en train de jouer avec .htaccess
et je me demandais si avec un .htaccess à l'intérieur du répertoire racine est possible de bloquer toutes les demande à partir d'un navigateur dirigé sur les fichiers existants ou répertoires.
Nous allons essayer cet exemple:
RewriteEngine On
RewriteBase /~my_user/my_base/
RewriteRule ^list/$ list.php [L]
RewriteRule ^element_of_list/([a-zA-Z0-9\-]+)/$ element.php?elem_id=$1 [L]
Maintenant, si j'écris http://127.0.0.1/~my_user/my_base/list/
, c'est wroking bien, mais si j'écris http://127.0.0.1/~my_user/my_base/list.php
il travaille toujours. Je n'en veux pas. Je veux que l'utilisateur d'obtenir une erreur 404 dans le dernier cas.
Nous avons /etc/apache2/mods-enabled/userdir.conf
<IfModule mod_userdir.c>
UserDir public_html
UserDir disabled root
<Directory /home/*/public_html>
AllowOverride All
Options Indexes FollowSymLinks
<Limit GET POST OPTIONS>
Order allow,deny
Allow from all
</Limit>
<LimitExcept GET POST OPTIONS>
Order deny,allow
Deny from all
</LimitExcept>
</Directory>
</IfModule>
Mon premier essai était d'utiliser RewriteCond
:
RewriteCond %{REQUEST_FILENAME} -f [OR]
RewriteCond %{REQUEST_FILENAME} -d
RewriteRule ^(.*)$ 404.php [L]
Mais cela ne fonctionne pas. Chaque requête se termine redirigé vers 404.php
Mise à JOUR
J'ai donc réussi à créer le filtre pour les répertoires:
RewriteCond %{REQUEST_FILENAME} -d
RewriteCond %{REQUEST_URI} !^/~my_user/my_base/$ [NC]
RewriteRule ^(.*)$ 404.php [L]
Ce qu'il fait est de vérifier si le chemin demandé (REQUEST_FILENAME
) existe et est un répertoire ET si ce n'est pas mon RewriteBase qui est essentiellement index.php puis rediriger vers 404.php
Je suis encore à essayer de trouver quelque chose qui fait la même chose pour les fichiers. Je sais que je peux sélectivement le faire à l'aide des extensions de nom de fichier mais j'ai envie d'une filtre universel pour les fichiers.
OriginalL'auteur dierre | 2010-09-24
Vous devez vous connecter pour publier un commentaire.
Si j'ai bien compris vos besoins correctement, vous cherchez à faire quelque chose comme ceci:
Gardez à l'esprit que ce qui bloque tout qui existe, de sorte que toute les images, feuilles de style, scripts ou sera envoyé à la page 404. Si vous voulez juste pour bloquer l'accès aux fichiers PHP, Gumbo est la solution est plus approprié. Je pense que dans ce cas, vous aurez besoin d'un autre
RewriteCond
bien que pour éviter de boucle:$0
là? Contient-il${REQUEST_FILENAME}
? Et vous enchaîné 5RewriteCond
, comment apache comprendre vous avez besoin pour affronter les trois derniers avec le résultat des deux premiers? Est-il juste d'évaluer les deux premiers avant tout (dans l'ordre d'apparition)?Le
$0
est une référence arrière à laRewriteRule
modèle de test (il contient l'intégralité du match de^.*$
). Il aurait été possible de condenser ces deuxRewriteCond
dans le motif de test de laRewriteRule
, je suppose que, comme!^(|404\.php)$
. Comme pour la chaîne, il y a un impliciteAND
qui rejoint l'ensemble deRewriteCond
ensemble, à moins de spécifier le[OR]
drapeau.Par ailleurs, mod_rewrite processus du motif de test de la
RewriteRule
d'abord, puis les tests de chaqueRewriteCond
qui est attaché à la règle actuelle (directement au-dessus d'elle, en commençant par le haut et vers le bas. Si tout ce passe, puis il procède à la substitution, dans laRewriteRule
.Je pensais, que vous utilisez dans
ErrorDocument
le chemin d'accès complet deRewriteBase
, est-il env:variable contenant la valeur deRewriteBase
?Non pas que je suis au courant de. Il y a aussi pas une façon de
ErrorDocument
utiliser le fichier relatif au répertoire courant, autant que je sache. Dans ce cas, il pourrait être préférable de rediriger vers 404.php directement, comme leRewriteRule
dans le deuxième exemple, car alors vous ne avez pas besoin d'écrire le chemin d'accès complet à nouveau. Juste être sûr que 404.php renvoie une erreur 404 statut d'en-tête dans ce cas.OriginalL'auteur Tim Stone
Essayer cette règle:
Cela réécrit toutes les demandes dont les chemins contiennent un
.php
en interne pour 404.php.En fait, pourquoi avez-vous besoin de la RewriteCond? Qu'en est RewriteRule ^(.*)\.php$ 404.php [L]
OriginalL'auteur Gumbo