/ / Rimuovere la barra finale con .htaccess all'interno di una sottodirectory: apache, .htaccess, mod-rewrite

Rimozione della barra finale con .htaccess all'interno di una sottodirectory - apache, .htaccess, mod-rewrite

Sto riscontrando un problema nella rimozione di barre finali usando un .htaccess file che esiste all'interno di una sottodirectory.

Normalmente, questa sarebbe una soluzione semplice, perché ci sono già diverse soluzioni su Stack Overflow per a simile, ma strutturalmente diverso, problema. Queste soluzioni non considerano il .htaccess file esistente nella sottodirectory (al contrario del livello principale).

Ad esempio, supponiamo che io abbia la seguente struttura di file:

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

Voglio rimuovere tutte le barre finali per le richieste successive http://server/subfolder/. Per esempio,

  • http://server/subfolder/file/ dovrebbe reindirizzare a http://server/subfolder/file
  • http://server/subfolder/news/12/ dovrebbe reindirizzare a http://server/subfolder/news/12

Al momento ho le seguenti regole in /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]

Con questa regola, gli esempi precedenti reindirizzano a quanto segue:

  • http://server/subfolder/file/ reindirizza a http://server/os/path/to/subfolder/file
  • http://server/subfolder/news/12/ reindirizza a http://server/os/path/to/subfolder/12

Cioè, invece di utilizzare il percorso relativo dal .htaccess punto (in questo caso, /subfolder), sta utilizzando il percorso del sistema operativo.

Posso porre rimedio alla situazione modificando il .htaccess usare RewriteBase:

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

Anche se funziona, questa non è una soluzione desiderata perché se sposto i file da /subfolder a /newsubfolder, Avrei dovuto modificare .htaccess a RewriteBase /newsubfolder. Cioè, ogni volta che questi file vengono spostati in un'altra sottocartella, il .htaccess il file deve essere aggiornato manualmente. Pertanto, l'insieme di file non sarebbe portatile, perché richiederebbe configurazione manuale del .htaccess file da usare percorsi assoluti.

Vorrei una soluzione più portatile, che può essere rilasciata in qualsiasi directory e funzionare indipendentemente dal suo percorso assoluto. Preferibilmente, questa soluzione non sarebbe utile RewriteBase, perché dalla mia comprensione questo non può essere impostato sulla sottodirectory corrente e deve fare riferimento a un percorso assoluto.

Ho trascorso diverse ore cercando di inventare unsoluzione, ma la maggior parte delle idee che ho visto riguardavano l'uso della directory principale o alcuni hack fastidiosi con variabili di ambiente. Qualsiasi idea sarebbe fantastica.

risposte:

1 per risposta № 1

È possibile utilizzare questa regola nel file .htaccess della sottocartella:

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]