Règle de réécriture d’Apache pour redirect toutes les requêtes vers un sous-répertoire contenant un autre fichier .htaccess et réécrire les règles

J’ai des projets publics et privés sur mon serveur Web. Je mets tout ce qui est public dans la racine du serveur Web et j’ai un dossier private que je ne peux atteindre que depuis un réseau local (défini par .htaccess).

Je veux simplement mettre tous les projets privés dans le dossier private et gérer les requêtes automatiquement, mais je veux que les URLs aient l’air d’être servies depuis webroot.
Par exemple, s’il y a private/project1 je souhaite utiliser l’URL http://example.com/project1 pour diffuser ce dossier et ne pas modifier l’URL.

Cette simple réécriture:

 RewriteEngine On RewriteBase / RewriteCond %{REQUEST_FILENAME} !-d RewriteCond %{REQUEST_FILENAME} !-f RewriteRule ^(.*)$ private/$1 

fonctionne, mais quand j’ai un private/project2 avec un autre .htaccess :

 Options +FollowSymLinks  RewriteEngine On RewriteBase /project2/  Order Deny,Allow Deny From All  # Allow asset folders through RewriteRule ^(assets/.+) - [L] # Protect files from being viewed RewriteRule ^(uploads.+) - [F,L] RewriteCond %{REQUEST_FILENAME} !-f RewriteCond %{REQUEST_FILENAME} !-d RewriteRule ^(.*)$ index.php/$1 [L]  Options -Indexes 

alors le contenu statique apparaîtra, mais les liens sont rompus. Que dois-je modifier pour travailler?

Aussi, si j’ai un projet private/project3 et que je private/project3 jusqu’à http://example.com/project3/ il n’y a pas de problème, mais lorsque je navigue sur http://example.com/project3 (sans fin /), l’URL sera visible sous http://example.com/private/project3/ dans le navigateur. Pourquoi ? Comment puis-je éviter cela?

Tout ce dont vous avez besoin est mod_alias.

Puis servez votre projet privé comme:

 Alias /project3 /apache/htdocs/private/project3 

Et avec .htaccess, vous contrôlerez les droits d’access.

Si vous souhaitez le contrôler sans redémarrer le serveur, vous pouvez essayer d’y parvenir avec la configuration suivante, qui peut être placée dans le fichier .htaccess:

 RewriteRule ^/(project1)$ /private/$1/index.html RewriteRule ^/(project1/)(.*)$ /private/$1$2 

index.html – tout fichier d’index pour votre projet. De cette façon, la partie publique des URL sera complètement accessible, à côté des chemins que vous utilisez pour les projets privés. Vous pouvez également append RewriteCond pour vérifier l’adresse IP et activer la réécriture uniquement pour votre réseau local.

En fait, si vous examinez votre question, il semble que ce soit un problème avec mod_dir qui interfère avec le pipeline du chemin. Plus précisément, DirectorySlash qui est activé par défaut 301 redirecta le navigateur lorsqu’il pense que le navigateur demande un répertoire et qu’il manque la barre oblique finale. Vous pouvez essayer de désactiver DirectorySlash Off mais un avertissement de sécurité y est associé :

La désactivation de la redirection de la barre oblique peut entraîner une divulgation d’informations. Envisagez une situation dans laquelle mod_autoindex est actif (Options + Index) et DirectoryIndex est défini sur une ressource valide (par exemple, index.html) et aucun autre gestionnaire spécial n’est défini pour cette URL. Dans ce cas, une requête avec une barre oblique finale afficherait le fichier index.html. Mais une requête sans slash final listerait le contenu du répertoire.

Cela peut ou non être applicable à votre configuration. Vous pouvez également essayer de modifier votre règle de réécriture pour tenir compte d’une barre oblique finale:

 RewriteCond %{REQUEST_FILENAME} !-d RewriteCond %{REQUEST_FILENAME} !-f RewriteRule ^(.*)/$ private/$1/ RewriteCond %{REQUEST_FILENAME} !-d RewriteCond %{REQUEST_FILENAME} !-f RewriteRule ^(.*[^/])$ private/$1/ 

Mais j’ai eu des résultats mitigés en essayant que mod_rewrite et mod_dir jouent toujours bien l’un avec l’autre.

Les domaines virtuels ne suffiraient-ils pas?

Vous pouvez utiliser un domaine pour des projets privés et un autre pour des projets publics.

http://httpd.apache.org/docs/2.2/vhosts/examples.html