/ / Suppression de la barre oblique finale avec .htaccess dans un sous-répertoire - apache, .htaccess, mod-rewrite

Supprimer la barre oblique de fin avec .htaccess dans un sous-répertoire - apache, .htaccess, mod-rewrite

Je rencontre un problème pour supprimer les barres obliques de fin à l'aide d'un .htaccess fichier qui existe dans un sous-répertoire.

Normalement, ce serait une solution facile, car il existe déjà plusieurs solutions sur Stack Overflow pour un similaire, mais structurellement différent, problème. Ces solutions ne considèrent pas la .htaccess fichier existant dans le sous-répertoire (par opposition au niveau racine).

Par exemple, disons que j'ai la structure de fichiers suivante:

/subfolder/.htaccess
/subfolder/index.php
...

Je souhaite supprimer toutes les barres obliques de fin des demandes après http://server/subfolder/. Par exemple,

  • http://server/subfolder/file/ devrait rediriger vers http://server/subfolder/file
  • http://server/subfolder/news/12/ devrait rediriger vers http://server/subfolder/news/12

J'ai actuellement les règles suivantes dans /subfolder/.htaccess:

RewriteEngine On

# Strip ending slash
RewriteRule ^(.*)/$ $1 [L,R=301]

# Pipe request to controller
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^ index.php [L]

Avec cette règle, les exemples ci-dessus redirigent vers les éléments suivants:

  • http://server/subfolder/file/ redirige vers http://server/os/path/to/subfolder/file
  • http://server/subfolder/news/12/ redirige vers http://server/os/path/to/subfolder/12

Autrement dit, au lieu d'utiliser le chemin relatif de la .htaccess point (dans ce cas, /subfolder), il utilise le chemin du système d'exploitation.

Je peux remédier à la situation en modifiant le .htaccess utiliser RewriteBase:

# Strip ending slash
RewriteBase /subfolder
RewriteRule ^(.*)/$ $1 [L,R=301]

Bien que cela fonctionne, ce n'est pas une solution souhaitée parce que si je déplace les fichiers de /subfolder à /newsubfolder, Je devrais éditer .htaccess à RewriteBase /newsubfolder. Autrement dit, chaque fois que ces fichiers sont déplacés vers un sous-dossier différent, le .htaccess le fichier doit être mis à jour manuellement. Ainsi, l'ensemble de fichiers ne serait pas portable, car ils nécessiteraient configuration manuelle du .htaccess fichier à utiliser chemins absolus.

Je voudrais une solution plus portable, qui peut être déposée dans n'importe quel répertoire et fonctionner quel que soit son chemin absolu. De préférence, cette solution ne ferait pas appel à RewriteBase, car, à ma connaissance, cela ne peut pas être défini sur le sous-répertoire actuel et doit référencer un chemin absolu.

"J'ai passé plusieurs heures à essayer de trouver unsolution, mais la plupart des idées que j'ai vues impliquaient l'utilisation du répertoire racine ou impliquaient des hacks désagréables avec des variables d'environnement. Toutes les idées seraient fantastiques.

Réponses:

1 pour la réponse № 1

Vous pouvez utiliser cette règle dans le .htaccess de votre sous-dossier:

RewriteEngine On

RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{THE_REQUEST} s/+(.+?)/+[?s]
RewriteRule /$ /%1 [R=302,NE,L]

# generate rewrite base dynamically
RewriteCond %{REQUEST_URI}::$1 ^(.*?/)(.*)::2$
RewriteRule ^(.*)$ - [E=BASE:%1]

# Pipe request to controller
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^ %{ENV:BASE}index.php [L]