web-dev-qa-db-fra.com

La réécriture d'URL ne fonctionne pas dans wamp localhost

Je développe une application Web PHP. J'ai des pages, des articles, des catégories, des produits, etc.

Voici mon fichier .htaccess pour créer une URL conviviale pour le référencement:

Options -Indexes
RewriteEngine on
RewriteRule ^Page/(.*)/(.*)$ Page.php?Page_Id=$1&Page_Title=$2 [NC,L]
RewriteRule ^Product/(.*)/(.*)$ Product.php?Product_Id=$1&Product_Title=$2 [NC,L]
RewriteRule ^Category/(.*)/(.*)$ Category.php?Category_Id=$1&Category_Title=$2 [NC,L]
RewriteRule ^Single/(.*)/(.*)$ Single.php?Post_Id=$1&Post_Title=$2 [NC,L]
RewriteRule ^Blog/(.*)/(.*)$ Blog.php?Category_Id=$1&Category_Title=$2 [NC,L]

RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME}.php -f
RewriteRule ^(.+)$ $1.php [L,QSA]


<FilesMatch "\.(htaccess|htpasswd|ini|phps|fla|psd|log|sh)$">
    Order Allow,Deny
    Deny from all
</FilesMatch>
<IfModule mod_expires.c>
    ExpiresActive On
    ExpiresDefault "access plus 1 month"
    ExpiresByType image/x-icon "access plus 1 year"
    ExpiresByType image/gif "access plus 1 month"
    ExpiresByType image/png "access plus 1 month"
    ExpiresByType image/jpg "access plus 1 month"
    ExpiresByType image/jpeg "access plus 1 month"
    ExpiresByType text/css "access plus 1 month"
    ExpiresByType application/javascript "access plus 1 year"
</IfModule>

Quand je visite Page.php?Page_Id=13 cela fonctionne. Et aussi quand je visite Page/13/Page-Title cela fonctionne. Tout va bien lorsque je teste mon application sur le serveur, mais cela ne fonctionne pas dans wamp localhost.

Je actif

LoadModule rewrite_module modules/mod_rewrite.so

dans Apache http.conf et voici mon vhost:

    <VirtualHost *:8080>
    ServerName localhost
    DocumentRoot c:/wamp64/www
    <Directory  "c:/wamp64/www/">
        Options +Indexes +Includes +FollowSymLinks +MultiViews
        AllowOverride All
        Require local
    </Directory>
</VirtualHost>


<VirtualHost *:8080>
    ServerName schoolarshop
    DocumentRoot "c:/wamp64/www/schoolarshop"
    <Directory  "c:/wamp64/www/schoolarshop/">
        Options +Indexes +Includes +FollowSymLinks +MultiViews
        AllowOverride none
        Require local
    </Directory>
</VirtualHost>

Exemple d'erreur dans localhost:

Notice: Undefined index: Page_Id in Page.php on line 8

Pourquoi cela fonctionne-t-il sur le serveur et pas dans localhost?

J'ai googlé beaucoup mais il ne trouve rien.

2
Mohammadreza
Options +Indexes +Includes +FollowSymLinks +MultiViews

Pourquoi activez-vous explicitement MultiViews dans la configuration de votre serveur? C'est probablement la cause de votre problème. Essayez de supprimer +MultiViews de la configuration de votre serveur (ci-dessus) et/ou de désactiver MultiViews en haut de votre .htaccess:

 Options -Indexes -MultiViews

MutliViews est désactivé sur une installation Apache par défaut. Cependant, certains hôtes (partagés) semblent l’activer. Il est donc probablement recommandé de le désactiver dans .htaccess.

(Mais aussi, pourquoi activez-vous Includes - est-ce vraiment nécessaire? Puisque vous utilisez PHP, c'est peu probable.)

L'effet de MultiViews est perceptible car vous avez efficacement supprimé l'extension de fichier pour créer vos URL conviviales.

Lorsque MultiViews est activé (élément de mod_negotiation) ... lorsque vous demandez Page/13/Page-Title, Apache essaie de trouver un fichier correspondant dans le répertoire/racine actuel qui correspond au nom de base Page, en essayant diverses extensions renvoyant le type de mime approprié. Cela se produit avant mod_rewrite est capable de réécrire votre URL conviviale. Ainsi, MultiViews finit par réécrire votre demande sur Page.php sans transmettre aucun des paramètres d'URL (le reste de l'URL sera probablement considéré comme PATH_INFO), d'où votre avis "d'index non défini" PHP.

(Bien que vous devriez également vérifier l'existence de cette variable $_GET dans votre script PHP, ce que vous ne semblez pas être en train de faire.)

2
MrWhite