2010-05-21 3 views
1

Je me demande comment je peux résoudre le problème suivant. sur le répertoire racine de mon serveur se trouve un fichier calles upload.phphtaccess protection par mot de passe et mod-réécriture?

Je veux être en mesure d'ajouter un "/ upload" (sans .php) à mon URL et le navigateur devrait demander un mot de passe (et peut-être nom d'utilisateur si possible). Je saisis le mot de passe (et le nom d'utilisateur) correctement upload.php devrait être ouvert.

Est-ce possible avec htaccess?

Répondre

2

Oui, ce sont deux questions distinctes.

Première: supprimer l'extension .php

Il y a principalement deux façons de le faire.

  • Activer la négociation de contenu lance MultiViews. Cela vous permettra de vous référer à d'autres ressources sans extension et même avoir plusieurs fichiers avec des noms similaires mais des extensions différentes et laissez Apache choisir le meilleur selon ce que le navigateur préfère. Voir le lien Vous pouvez l'activer avec Options +MultiViews dans un bloc <Directory> dans http.conf ou .htaccess si vous autorisez le remplacement pour cette option.
  • Utilisez mod_rewrite. Une règle spécifique à votre cas pourrait être RewriteRule ^upload$ upload.php. Cela peut également être mis dans un bloc <Directory> dans http.conf ou .htaccess (si activé). Vous devez avoir activé mod_rewrite et le moteur de réécriture avec RewriteEngine on.

secondes: nécessitent une authentification

Vous pouvez le faire à la fois avec PHP et Apache.

  • Pour Apache, voir les documents here. Pour PHP, en utilisant l'authentification de base (attention, le mot de passe sera envoyé au serveur en texte clair et à moins que vous n'utilisiez https, il peut être snobé par quelqu'un qui regarde votre trafic), vous pouvez faire quelque chose comme ça:

 

function send401() { 
    $realm = "Credentials for upload"; 
    header('WWW-Authenticate: Basic realm="'.$realm.'"'); 
    header('HTTP/1.1 401 Unauthorized'); 
    die(); 
} 

function verify_credentials($user, $password) { 
    //check user and password here. Return true or false 
    return true; 
} 

if (!array_key_exists('PHP_AUTH_USER',$_SERVER) || 
     !array_key_exists('PHP_AUTH_PW',$_SERVER)) { 
    send401(); 
} 
elseif (!verify_credentials($_SERVER['PHP_AUTH_USER'], 
     $_SERVER['PHP_AUTH_PW'])) 
    send401(); 

//if it gets here, the user was successfully authenticated 
+0

+1 Pour les détails. Mais n'utilisez pas l'authentification de base; utilisez plutôt l'authentification Digest Access. – Gumbo

Questions connexes