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.
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.)