web-dev-qa-db-fra.com

Rediriger tout après la barre oblique (/) vers un autre répertoire

Je suis sûr que c'est une chose facile à faire mais je n'arrive pas à trouver la réponse!

J'essaie de rediriger https://carddav.example.com/MYUSERNAME vers https://carddav.example.com/remote.php/subdomain/addressbooks/MYUSERNAME/contacts où MYUSERNAME peut être n'importe quoi.

Le RewriteRule actuel que j'ai essayé ressemble à ceci:

RewriteRule ^/(.*)$ https://carddav.example.com/remote.php/carddav/addressbooks/$1/contacts/ [R=301]
2
aidanharris

Vous pouvez le faire avec un seul RewriteRule. Le truc ici est de ne vérifier que les caractères nom d'utilisateur valides, pas tout (c.-à-d. .* - je n'aurais pas pensé que vos noms d'utilisateur pourraient être littéralement n'importe quoi? ). Cela serait également plus efficace car toutes les demandes ne correspondront pas et ne seront pas traitées.

Par exemple, en supposant que vos noms d'utilisateur ne peuvent comprendre que des lettres majuscules/minuscules et des chiffres, puis:

RewriteRule ^([a-zA-Z0-9])$ /remote.php/carddav/addressbooks/$1/contacts [R=301]

Ceci est très similaire à votre tentative initiale. Notez que le modèle RewriteRule dans les fichiers .htaccess par répertoire ne commence pas par une barre oblique. Toutefois, si cette règle était utilisée dans la configuration de votre serveur, elle le ferait!

Cela évite aussi naturellement la boucle de réécriture car "/remote.php/carddav ..." ne correspondra pas à un nom d'utilisateur valide (en particulier . et / ne correspondraient pas).

Vous pouvez également limiter la longueur du nom d'utilisateur, pour dire entre 4 et 20 caractères ...

  • ^([a-zA-Z0-9]{4,20})$.

Si vous aviez besoin de faire correspondre n'importe quel caractère sauf une barre oblique (une barre oblique briserait sûrement votre URL de destination?), Vous pouvez utiliser un modèle du type

  • ^([^/]+)$
2
MrWhite

Problème résolu grâce à une sacrée persévérance. Je devrais vraiment prendre le temps d'apprendre tout le mod_rewrite à un moment donné…

En bref, j'ai résolu la boucle de redirection avec la condition suivante:

RewriteCond %{REQUEST_URI} !^/remote.php/

La condition ci-dessus correspond fondamentalement à tout ce qui n'est pas remote.php/ANYTHING_HERE

J'ai ensuite utilisé le RewriteRule ci-dessus

RewriteRule ^(.*)$ /remote.php/carddav/addressbooks%{REQUEST_URI}/contacts [R=301]

Le RewriteRule est presque identique à mon commentaire précédent, à la différence qu'il utilise la requête réelle (qui est un nom d'utilisateur dans mon cas et inclut une barre oblique -/- donc il n'en faut pas un à la fin des carnets d'adresses).

Le résultat final est une redirection permanente complète et une URL courte pratique que je peux utiliser pour accéder à carddav.

1
aidanharris