mod_rewrite au chemin absolu dans .htaccess – tournant vers le haut 404

Je veux mapper un certain nombre de répertoires dans une URL:

www.example.com/manual www.example.com/login 

vers des répertoires en dehors de la racine Web.

Ma racine Web est

 /www/htdocs/customername/site 

le manuel que je veux redirect est en

 /www/customer/some_other_dir/manual 

Dans mod_alias, cela serait égal à

 Alias /manual /www/customer/some_other_dir/manual 

mais comme je n’ai access qu’à .htaccess , je ne peux pas utiliser Alias, je dois donc utiliser mod_rewrite .

Ce que j’ai maintenant après cette question est le suivant:

 RewriteRule ^manual(/(.*))?$ /www/htdocs/customername/manual/$2 [L] 

Cela fonctionne dans le sens où les requêtes sont reconnues et redirigées correctement, mais je reçois un 404 qui ressemble à ceci (notez le chemin absolu):

 The requested URL /www/htdocs/customername/manual/resourcename.htm was not found on this server. 

Cependant, j’ai vérifié avec PHP: echo file_exists(...) et ce fichier existe définitivement.

pourquoi serait-ce? Selon les documents de mod_rewrite, cela est possible, même dans un fichier .htaccess. Je comprends que quand on fait mod_rewrite dans .htaccess, il y aura un préfixe automatisé, mais pas des chemins absolus, n’est-ce pas?

Cela ne devrait pas être un problème de droits non plus: Ce n’est pas dans la racine Web, mais dans l’arborescence FTP à laquelle un seul utilisateur, le compte FTP principal, a access.

Je peux changer la racine Web dans le panneau de commande à tout moment, mais je veux que cela fonctionne comme je l’ai décrit.

Ceci est un hébergement partagé, donc je n’ai pas access aux journaux d’erreur.

Je viens de vérifier, ce n’est pas une redirection 301 injustifiée, juste une réécriture interne.

AFAIK mod_rewrite fonctionne au niveau du “protocole” (c’est-à-dire sur le HTTP fil). Donc, je suppose que vous obtenez HTTP 302 avec votre chemin de répertoire dans l’emplacement.

J’ai donc peur que vous soyez coincé sauf si .. votre hébergement vous permet de suivre des liens symboliques; vous pouvez donc créer un lien vers cet emplacement (en supposant que vous ayez access au shell ou que cela soit possible en utilisant FTP ou votre panneau de contrôle) sous la racine de votre document actuel.

Edit: En fait, il mentionne le hook de phase du fichier URL dans les documents . Je pense donc que les directives de répertoire ne permettent pas suffisamment d’permissions.

Dans .htaccess, vous ne pouvez pas réécrire les fichiers en dehors de wwwroot.

Vous devez avoir un lien symbolique dans la racine Web qui pointe vers l’emplacement du manuel.

Ensuite, dans votre .htaccess, vous avez besoin de la ligne:

 Options +SymLinksIfOwnerMatch 

ou peut-être un peu plus aveuglément

 Options +FollowSymlinks 

Ensuite vous pouvez

 RewriteRule ^manual(/(.*))?$ /www/htdocs/customername/site/manual/$2 [L] 

où manuel sous site est un lien vers / www / customer / some_other_dir / manual

Vous créez le lien symbolique sur la ligne de commande avec:

 ln -s /www/htdocs/customername/site/manual /www/customer/some_other_dir/manual 

Mais j’imagine que vous êtes sur l’hébergement partagé sans access au shell, alors essayez de créer des liens symboliques dans CPanel, Webmin, ou quelle que soit votre interface d’administration. Il existe des scripts php / cgi qui le font aussi. Bien sûr, vous êtes toujours limité aux permissions que l’hôte vous a données. S’ils ne vous permettent pas de suivre les liens symboliques en tant que politique, vous ne pouvez pas les remplacer dans votre fichier .htaccess.

Cela vous indique ce que vous devez savoir. L’URL demandée /www/htdocs/customername/manual/resourcename.htm n’a pas été trouvée sur ce serveur. Il interprète RewriteRule ^manual(/(.*))?$ /www/htdocs/customername/manual/$2 [L] comme signifiant réécrire exemple.com/manual/ comme s’il s’agissait de example.com/www/htdocs/customername/ Manuel/.

Essayer

  RewriteRule ^manual(/(.*))?$ /customername/manual/$2 [L] 

au lieu.