web-dev-qa-db-fra.com

À l’aide de htaccess, comment limiter la consultation du contenu des répertoires tout en permettant au serveur d’utiliser ce contenu?

Plus précisément, j'ai un fichier htaccess qui empêche quiconque de voir le contenu du répertoire. Ainsi, personne ne peut voir mes milliers d’images dans www.example.com/images en utilisant:

deny from all
allow from 127.0.0.1

Cependant, je souhaite utiliser ces images sur www.example.com telles que, <img src="images/thisimg.jpg" /> fonctionne.

J'espère que je suis dans la bonne direction, mais j'apprécie toute perspicacité/réorientation. Cela ressemble à: Comment protéger tout le contenu du répertoire, mais accéder au script php mais je veux créer un lien vers ces images dans ce répertoire, et utiliser deny from all ne me permet pas de le faire. 

Merci d'avance pour votre aide.

21
Josh

Tout ce dont vous avez besoin pour empêcher les gens de voir le contenu du répertoire est un fichier index.php ou .html dans ce dossier. Toutes les demandes de yoursite.com/images chargeront index.php, que vous définissez sur une page factice.

index.html pourrait être quelque chose comme:

<html><title>Forbidden!</title><body>Nothing to see here...</body></html>

ou un script de redirection index.php:

<?php header('Location: /index.php'); exit(); ?>

N'utilisez pas .htaccess pour bloquer les entrées de répertoire, cela bloque l'accès à tout.

24
Fosco
42
Magicianeer

Option 1 (facile mais pas préférable) -

Vous n'avez pas besoin de créer un fichier index comme celui-ci-

<html>
  <title>Forbidden!</title>
  <body>
    <h1>Access Denied !!</h1>
  </body>
</html>

Et placez-le dans chaque répertoire de ressources et chaque répertoire que vous ne souhaitez pas montrer aux utilisateurs.

Option 2 (plus préférable) -

Vous pouvez simplement ajouter ceci à la fin de votre fichier .htaccess.

Options -Indexes

Donc, votre fichier .htaccess peut ressembler à ceci-

<IfModule mod_rewrite.c>
    <IfModule mod_negotiation.c>
        Options -MultiViews
    </IfModule>

    RewriteEngine On

    # Redirect Trailing Slashes If Not A Folder...
    RewriteCond %{REQUEST_FILENAME} !-d
    RewriteRule ^(.*)/$ /$1 [L,R=301]

    # Handle Front Controller...
    RewriteCond %{REQUEST_FILENAME} !-d
    RewriteCond %{REQUEST_FILENAME} !-f
    RewriteRule ^ index.php [L]

    # Handle Authorization Header
    RewriteCond %{HTTP:Authorization} .
    RewriteRule .* - [E=HTTP_AUTHORIZATION:%{HTTP:Authorization}]

    Options -Indexes
</IfModule>

Si vous faites cela et essayez d'aller dans un répertoire, vous obtiendrez quelque chose comme ceci-

 enter image description here


Ainsi, personne ne pourra découvrir aucun répertoire sur le serveur.

Plus peut être trouvé ici .

14
Abrar Jahin

Solution la plus simple: créez un nom de page vierge index.html dans votre dossier d'images :)

3
diEcho

Utilisez quelque chose comme ceci dans le fichier .htaccess:

 #
 ###################################################################
 ###                                                             ###
 ###                    Currently protection                     ###
 ###              images (jpg, jpeg, gif, png, bmp)              ###
 ###                       JavaScript (js)                       ###
 ###                Cascading Style Sheets (CSS)                 ###
 ###                                                             ###
 ###################################################################
 #
 <IfModule mod_rewrite.c>
 RewriteCond %{HTTP_REFERER} !^http://(www\.)?mysite.com/.*$ [NC]
 RewriteCond %{HTTP_REFERER} !^http://(www\.)?mysite.com$ [NC]
 RewriteRule .*\.(jpg|jpeg|gif|png|bmp|js|css)$ http://access-                    denied.us/hotlinks.html [NC,L]
 </ifModule>
 #

Cela permettra à vos pages de charger les documents et les images souhaités tout en empêchant tout le monde d’autres pages de le faire. Je l'utilise sur tous mes sites et cela fonctionne très bien.

2
Doug

Pour moi, je pense que le moyen le plus simple de le faire est d’utiliser une redirection. Dans le répertoire images, créez simplement une page d’index et dans la page d’index, vous avez une redirection vers la page d’index de votre site i.e

<?php
   header( 'Location: http://www.yoursite.com' ) ;
?>

Ainsi, chaque fois que quelqu'un essaie d'accéder directement à la page de l'image, il finit par aller à la racine de votre site.

1
viruxINf3t3d

dans ce dossier dont vous voulez afficher l'accès interdit

<!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML 2.0//EN">
<html><head>
<title>403 Forbidden</title>
</head><body>
<h1>Forbidden</h1>
<p>You don't have permission to access This Folder
on this server.</p>
</body></html>

0
Mohsin Shoukat

Si c'était moi, je m'assurerais que le référent est www.example.com, ce qui en fait une des utilisations principales.

0
Chris Eberle

La suggestion de Magicianeer est la meilleure pour ce problème. Si vos images sont divisées en sous-dossiers, vous devez placer un fichier d’index dans chacun d’eux. Les options -Indexes ne doivent être effectuées qu'une fois à la racine.

0
grim apples

deny from all permet aux fichiers d'être utilisés par les scripts côté serveur, mais limite l'accès complet au Web.

0
transilvlad

J'utilise une astuce qui fait croire aux gens qu'ils ont accédé à un dossier qui n'existe pas.

Créez un fichier HTML et ajoutez ceci:

<!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML 2.0//EN">
<html>
<head>
<title>404 Not Found</title>
</head>

<body>
<h1>Not Found</h1>
<p>The requested URL was not found on this server.</p>
<p>Additionally, a 404 Not Found
error was encountered while trying to use an ErrorDocument to handle the request.</p>

</body>
</html>

0
Simy