Comment utiliser uniquement mod_rewrite pour accéder aux fichiers PHP et désactiver la manière native de se référer au fichier PHP?

Je suis très nouveau sur ces questions, aidez-moi s’il vous plaît.

J’ai deux questions concernant mod_rewrite (apache 2.2).

1) Ce que je veux faire par exemple, c’est réécrire / connecter à login.php. Cela peut être fait par

RewriteRule ^/?login/?$ /login.php [L] 

Cependant, ce que je voulais faire également, c’est désactiver les utilisateurs pour accéder directement à /login.php.

Si je viens d’écrire,

 RewriteRule ^/?.*\.php$ /file_not_exist.html [L] 

Cela ne fonctionne pas et même / login sera réécrit dans /file_not_exist.html.

Y’a-t’il un quelconque moyen d’y arriver? Je remarque que dans les documents Apache 2.5, il existe un indicateur [END] mais je ne peux pas encore l’utiliser dans Apache 2.2.

2) Je veux remplacer toutes les requêtes ajax par / ajax / action,

 RewriteRule ^/?ajax/([a-zA-Z]+)/?$ /ajax/$1.php [L] 

Cependant, quand j’essaye d’accéder à / ajax / xyz où xyz.php n’existe pas, le navigateur montrera que “/ajax/xyz.php” n’existe pas, ce qui fera savoir à ppl que / ajax / action est implémenté par /ajax/action.php.

Comment désactiver tel /ajax/xyz.php n’existe pas de message? La seule façon dont je peux penser maintenant est d’énumérer tous les fichiers dans la direction ajax et de faire ce qui suit,

RewriteRule ^ /? Ajax / (action1 | action2 | action3) /? $ /Ajax/$1.php [L]

Ensuite, lorsque l’utilisateur accèdera à / ajax / xyz, il dira simplement que / ajax / xyz n’existe pas, mais pas /ajax/xyz.php. Mais c’est très gênant. Y a-t-il une meilleure façon de le faire?

Merci beaucoup!

1) Si vous souhaitez restreindre les demandes de /login.php, vous devez utiliser un RewriteCond pour vérifier la demande réelle. Sinon, vous allez faire une boucle.

 RewriteCond %{THE_REQUEST} ^[AZ]{3,9}\ /login.php RewriteRule ^ /file_not_exist.html [L] 

Vous pouvez également les redirect vers /login si vous voulez et laisser la première règle s’en occuper:

 RewriteRule ^ /login/ [L,R=301] 

2) Vous pouvez vérifier si un fichier existe déjà avant de réécrire le php, à nouveau en utilisant RewriteCond et en utilisant “-f”

 RewriteCond %{REQUEST_URI} ^/ajax/(.+)/? RewriteCond %{DOCUMENT_ROOT}/ajax/%1.php !-f RewriteRule ^ /ajax/no_action.php [L] 

Nous vérifions donc d’abord que la requête commence par “/ ajax /” et que nous sélectionnons la partie suivante “(. +)”. Dans le prochain RewriteCond, nous utilisons la référence arrière% 1 pour accéder à la correspondance précédente. Donc, si la requête était pour “/ ajax / blahblah /”, le prochain RewriteCond vérifierait “/doc_root/ajax/blahblah.php”. Le! -F signifie “si le fichier n’existe pas”. Ainsi, dans cet exemple, si “/doc_root/ajax/blahblah.php” n’existe pas, alors nous réécrivons la requête dans “/ajax/no_action.php”. Vous devez remplacer cela par quelque chose que vous voulez gérer toutes les “mauvaises” requêtes. Peut-être le diriger vers un script vierge que simple ne fait rien pour que personne ne sache le plus sage. Vous pouvez alors faire une réécriture pour changer /ajax/(.+)/ en /ajax/$1.php:

 RewriteRule ^ajax/([A-Za-z]+)/?$ /ajax/$1.php [L] 
  RewriteRule ^/?.*\.php$ /file_not_exist.html [L] 

Cela fonctionnerait. Mais pas quand vous en faites le deuxième RewriteRule. L’ordre est important. Voir aussi Serverfault: tout ce que vous avez toujours voulu savoir sur les règles Mod_Rewrite, mais que vous n’aviez pas peur de demander?

Plus précisément, vous pouvez explorer le %{REQUEST_URI} directement pour l’existence -f et ensuite s’il correspond au motif. .*\.php($|/) .


Je ne comprends pas très bien votre deuxième question. Mais il semble que vous devriez utiliser PATH_INFO:

  RewriteRule ^/?ajax/([a-zA-Z]+)/?$ /ajax.php/$1 [L] 

Parce que réécrire en un $1.php inexistant doit évidemment entraîner une erreur.

(S’il s’agit toutefois d’un vrai répertoire avec de vrais scripts, utilisez simplement le test RewriteCond avec -f .)

Voici ce que je fais pour mon site Web: (1) définir correctement 404 dans votre vhost (et ceci est une réponse à votre deuxième question: écrivez votre propre fichier 404 où vous ne montrez que ce que vous voulez). c’est local (= environnement dev) puis affiche beaucoup d’informations)

 ErrorDocument 404 /404.php 

(2) Interdire tout access direct aux fichiers php:

 RewriteRule (.*)php$ - [L,R=404] 

Dis moi si ça marche