J'ai une configuration Apache où je liste blanche les adresses IP à un sous-dossier non-WordPress comme ceci:
<Directory /var/www/html/link>
Order allow,deny
Require all granted
#Our Network
Allow from ip-address/22
Allow from ip-address/24
Allow from ip-address/24
Allow from ip-address/24
#and even longer list of IPs and other folders
</Directory>
J'aimerais également autoriser les personnes qui n'appartiennent pas à ce bloc IP mais ont un compte utilisateur. Y a-t-il un moyen de faire ça?
Cette méthode n'est pas sécurisée à 100%, mais pour la plupart des utilisateurs (comme 99%), cela fonctionnera.
Ici, vous utiliserez essentiellement un fichier .htaccess
dans le répertoire restreint , par exemple: /var/www/html/link
avec le code suivant:
SetEnvIf Cookie "^.*wordpress_logged_in.*$" WP_LOGGED_IN=maybe
Order allow,deny
Require all granted
# Our Network
#Allow from ip-address/22
#Allow from ip-address/24
#Allow from ip-address/24
#Allow from ip-address/24
# and even longer list of IPs
# Perhaps WordPress is logged in according to cookie: works for trivial cases, but not 100% secure
Allow from env=WP_LOGGED_IN
Ainsi, au lieu de config Apache, vous placerez les réseaux IP autorisés dans ce fichier .htaccess
(sans le bloc <Directory>
), qui vérifiera également le cookie de connexion WordPress à l’aide de la directive SetEnvIf
. Si l'adresse IP ne figure pas dans le cookie de correspondance et de connexion introuvable, ce code interdira l'accès aux visiteurs restants.
Aucune modification dans le fichier .htaccess
du répertoire Web racine n'est nécessaire.
Si vous avez besoin d'une méthode 100% sécurisée, il est préférable de le faire avec PHP.
Commencez par supprimer toutes les restrictions IP existantes (pour le répertoire correspondant) du fichier de configuration Apache.
Ensuite, utilisez le code suivant dans le fichier .htaccess
de votre répertoire Web racine.
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteBase /
RewriteRule ^link/access\.php$ - [L]
RewriteRule ^link/.*$ /link/access.php [L]
# Your remaining rewrite rules for WordPress
</IfModule>
Ensuite, dans le fichier /var/www/html/link/access.php
, utilisez le code PHP suivant:
<?php
function network_match( $ip, $networks ) {
foreach( $networks as $network ) {
$net_parts = explode( '/', $network );
$net = $net_parts[0];
if( count( $net_parts ) === 2 ) {
$netmask = $net_parts[1];
if( ( ip2long( $net ) & ~ ( ( 1 << ( 32 - $netmask ) ) - 1 ) ) === ( ip2long( $ip ) & ~ ( ( 1 << ( 32 - $netmask ) ) - 1 ) ) ) {
return true;
}
}
else if( $ip === $net ) {
return true;
}
}
return false;
}
$networks = array(
// Put your allowed networks HERE
"192.168.0.0/24",
"127.0.0.1"
);
$allowed = false;
if( network_match( $_SERVER['REMOTE_ADDR'], $networks ) ) {
$allowed = true;
}
else {
// assuming WordPress is installed one directory above
// if not, then change accordingly
require_once dirname( dirname( __FILE__ ) ) . "/wp-load.php";
if( is_user_logged_in() ) {
$allowed = true;
}
}
if( $allowed ) {
// HERE you SERVE THE REQUESTED FILE WITH PHP
echo "You are allowed";
}
else {
die("Access denied!");
}
En l'état actuel des choses, ce CODE réécrit fondamentalement en interne toutes les demandes dans le répertoire /var/www/html/link/
dans le fichier /var/www/html/link/access.php
et vérifie l'autorisation d'accès IP et la connexion à WordPress.
Vous pouvez modifier ce PHP CODE (dans la ligne qui dit: // HERE you SERVE THE REQUESTED FILE WITH PHP
) pour servir les fichiers demandés à partir du répertoire link
.
Vous pouvez vérifier cette publication sur les fichiers du serveur à partir de PHP CODE .
Autant que je sache, le .htaccess (ou la configuration Apache) est prioritaire et vous ne pouvez pas le remplacer facilement. Il y a deux solutions:
1) Utilisez simplement le fichier simple-browser.php (modifiez le chemin du répertoire protégé selon vos besoins)
2) N'utilisez pas Apache config, utilisez plutôt .htaccess
dans ce répertoire, voici comment:
créez .htaccess
dans ce dossier:
<Directory "./">
Order allow,deny
Require all granted
#Our Network
Allow from ip-address/22
........
#DONT_REMOVE_ME_START
#DONT_REMOVE_ME_END
</Directory>
Tout d'abord, mettez le contenu ci-dessous dans votre functions.php
et après cela, envoyez les utilisateurs à ce lien: yoursite.com/?check_permission
:
define('path_to_target_htaccess', ABSPATH.'path/to/protected/folder/.htaccess');
add_action('init', 'start_validation');
function start_validation(){
if (isset($_GET['check_permission'])){
if(is_user_logged_in()){
$new_content= str_replace(
'#DONT_REMOVE_ME_START',
'#DONT_REMOVE_ME_START'."\r\n".'Allow from '.$_SERVER['REMOTE_ADDR'],
file_get_contents(path_to_target_htaccess)
);
file_put_contents(path_to_target_htaccess, $new_content);
header("location: /path/to/folder"); exit;
}
}
}
p.s. une fois par semaine ou par jour, exécutez une fonction qui supprimera toutes les lignes entre #DONT_REMOVE_ME_START
et #DONT_REMOVE_ME_END
Je ne me suis pas trouvé dans cette situation et je n'en sais pas plus sur WP qu'Apache, mais voici en gros comment je l'aborderais.
mod_setenvif
pour définir une variable d’environnement basée sur l’URL demandée contenant un certain code. Dites "wp-login-! 637 # 6".Redirect "foo.html" "wp/specialpage?foo.html"
.