web-dev-qa-db-fra.com

Comment supprimer .jsp extension et la remplacer par forward slash in htaccess?

Je veux supprimer l'extension .jsp de mon URL et la remplacer par une barre oblique, par exemple. example.com/xyz.jsp à example.com/xyz/ et example.com/xyz.jsp?ab=12 à example.com/xyz/?ab=12.

J'ai utilisé:

RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^([^/]+)/$ $1.php
RewriteRule ^([^/]+)/([^/]+)/$ /$1/$2.php
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_URI} !(\.[a-zA-Z0-9]{1,5}|/)$
RewriteRule (.*)$ /$1/ [R=301,L]

Et

RewriteEngine On
RewriteBase /

# external redirect from /example.html to /example
RewriteCond %{THE_REQUEST} ^[A-Z]{3,}\s/+([^.]+)\.html [NC]
RewriteRule ^ /%1/ [R=301,L]

# internal forward from /example/ to //example.html
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-l
RewriteCond %{DOCUMENT_ROOT}/$1.html -f
RewriteRule ^(.+?)/?$ /$1.html [L]

Dans mon .htaccess mais ni l'un ni l'autre ne fonctionnent pas correctement.

2
Vaibhav Singh

Vous devrez vous assurer que MultiViews est désactivé avant que cela fonctionne correctement, car cela risquerait d'entrer en conflit avec vos directives mod_rewrite. Ajoutez ceci dans votre fichier .htaccess:

Options +FollowSymLinks -MultiViews

(FollowSymLinks doit être activé pour que mod_rewrite fonctionne, donc pour être sûr.)

Ensuite, quelque chose comme ce que vous avez déjà semble raisonnable:

RewriteEngine On

RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{DOCUMENT_ROOT}/$1.jsp -f
RewriteRule (.+)/$ $1.jsp [L]

J'ai rendu la barre oblique obligatoire sur l'URL (sinon vous avez potentiellement deux URL accédant au même contenu - le contenu dupliqué).

PDATE: Pour rediriger toutes les demandes vers l'URL .jsp vers l'URL canonique (c'est-à-dire sans l'extension et avec une barre oblique), à ​​peu près comme ci-dessous (semblable à ce que vous aviez dans votre question) aurait besoin d'aller avant les directives ci-dessus:

RewriteCond %{THE_REQUEST} \.jsp\s
RewriteRule (.+)\.jsp$ /$1/ [R=301,L]

Cela n'est strictement nécessaire que si les URL .jsp _ ont été indexées ou liées de manière externe. S'il s'agit d'un nouveau site, cette étape est facultative.

Il est plus efficace de faire correspondre ce que vous pouvez avec le motif RewriteRule (c.-à-d. (.+)\.jsp$), plutôt que d'avoir un crochet -all regex ici. La condition THE_REQUEST garantit que cela ne s'applique qu'aux demandes initiales et non aux demandes réécrites - empêchant ainsi une boucle de redirection.

Donc, en résumé:

# Disable MultiViews
Options +FollowSymLinks -MultiViews

RewriteEngine On

# Remove file extension from URLs (external redirect)
RewriteCond %{THE_REQUEST} \.jsp\s
RewriteRule (.+)\.jsp$ /$1/ [R=301,L]

# Internally rewrite extensionless URLs back to ".jsp"
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{DOCUMENT_ROOT}/$1.jsp -f
RewriteRule (.+)/$ $1.jsp [L]

DEBUGGING: Pour vous aider à déboguer ce qui précède, ajoutez la directive suivante sous la directive RewriteEngine On et vérifiez les variables d'environnement (MOD_REWRITE_THE_REQUEST et MOD_REWRITE_URL_PATH) dans votre serveur. code de côté:

RewriteCond %{THE_REQUEST} (.*)
RewriteRule (.*) - [E=MOD_REWRITE_THE_REQUEST:%1,E=MOD_REWRITE_URL_PATH:$1]

Que contiennent ces variables d'environnement lorsque vous accédez à une URL .jsp?

1
MrWhite