4 votes

La réécriture d'URL ne fonctionne pas si le site web est accessible via un répertoire d'alias.

J'ai un site web dans le répertoire d:\www\mysite sur mon ordinateur local. J'ai installé WAMPServer et mis en place un répertoire alias mysite pour mon site.

Donc, par exemple, http://localhost/mysite/static-resource.html récupère correctement mon fichier qui est situé dans d:\www\mysite\static-resource.html .

Mon problème est lié à la réécriture d'URL dans mon fichier .htaccess fichier :

RewriteEngine On    
RewriteRule ^articles/(\d+) ./article.php?id=$1

Lorsque j'essaie d'accéder http://localhost/mysite/articles/1 Je reçois cette réponse :

Non trouvé

L'URL demandée /www/mysite/article.php n'a pas été trouvée sur ce serveur. serveur.

Je peux confirmer qu'il existe un article.php à l'adresse d:\www\mysite\article.php .

Dans le passé, j'avais la racine de mon site ( d:\www\mysite ) mis en place comme le DocumentRoot du serveur Apache (au lieu de c:\wamp\www qui est la valeur par défaut), et dans ce scénario, ma réécriture d'URL a travaillé Le problème que je rencontre actuellement doit donc être lié au fait que mon site se trouve "derrière" un répertoire d'alias.


Le contenu de mon mysite.conf fichier :

Alias /mysite/ "d:/www/mysite/" 

<Directory "d:/www/mysite/">
    Options Indexes FollowSymLinks MultiViews
    AllowOverride all
        Order allow,deny
    Allow from all
</Directory>

8voto

ThinkingMonkey Points 6309

Je ne vois pas de RewriteBase dans vos règles de réécriture.
Dans votre .htaccess , ajoutez un RewriteBase règle.

RewriteEngine On    
RewriteBase /mysite/
RewriteRule ^articles/(\d+) ./article.php?id=$1

RewriteBase doit avoir /mysite/ à cause de votre Alias /mysite/ "d:/www/mysite/"

Si seulement http://localhost/mysite est accédé, il devrait retourner un not found on this server . Si vous ne voulez pas que cela se produise, ajoutez un autre alias avec le précédent comme ceci :

Alias /mysite "d:/www/mysite/" 

o

Juste ça :

AliasMatch /mysite(/.*)? d:/www/mysite/$1 

pourquoi une RewriteBase ? de Directive RewriteBase Docs Apache :

La directive RewriteBase définit explicitement l'URL de base pour les réécritures par répertoire. Comme vous le verrez plus loin, RewriteRule peut être utilisé dans des fichiers de configuration par répertoire (.htaccess). Dans ce cas, il agira localement, en supprimant le préfixe du répertoire local avant le traitement, et en appliquant les règles de réécriture uniquement au reste. Une fois le traitement terminé, le préfixe est automatiquement réintroduit dans le chemin. Le paramètre par défaut est : RewriteBase physical-directory-path

Lorsqu'une substitution se produit pour une nouvelle URL, ce module doit réinjecter l'URL dans le traitement du serveur. Pour ce faire, il doit savoir quel est le préfixe ou la base de l'URL correspondant. Par défaut, ce préfixe est le chemin de fichier correspondant lui-même. Toutefois, pour la plupart des sites Web, les URL ne sont PAS directement liées aux chemins d'accès physiques des fichiers, de sorte que cette hypothèse est souvent fausse ! Vous pouvez donc utiliser la directive RewriteBase pour spécifier le préfixe d'URL correct.

Exemple de Directive RewriteBase Docs Apache :

#
#  /abc/def/.htaccess -- per-dir config file for directory /abc/def
#  Remember: /abc/def is the physical path of /xyz, i.e., the server
#            has a 'Alias /xyz /abc/def' directive e.g.
#

RewriteEngine On

#  let the server know that we were reached via /xyz and not
#  via the physical path prefix /abc/def
RewriteBase   /xyz

#  now the rewriting rules
RewriteRule   ^oldstuff\.html$  newstuff.html

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X