Domanda

Vorrei usare la riscrittura mod per convertire gli indirizzi delle pagine Web come / directory in /directory/index.html , in una situazione di hosting LAMP standard. Quello che ho funziona per gli indirizzi che finiscono in una barra. Non riesco a trovare un modo per gestire indirizzi che non terminano una barra .

Quello che dovrebbe funzionare dovrebbe essere:

rewriterule ^(.*)/$ $1/index.html [L] /* addresses ending in / */
rewriterule ^(.*(?!html))$ $1/index.html [L] /* where the problem is */

Ma la seconda riga causa un errore del server 500. Se aggiungo una singola lettera x alla seconda riga:

rewriterule ^(.*)/$ $1/index.html [L]
rewriterule ^(.*x(?!html))$ $1/index.html [L]

Inizia a funzionare, ma solo per i nomi di directory che terminano con una x . Ho provato a sostituire la x con molte cose diverse. Qualsiasi cosa più complicata dei caratteri reali (come [^ x] o. +) Genera un errore del server 500.

E, per soddisfare la mia curiosità, qualcuno sa perché l'aggiunta di una singola lettera reale fa la differenza tra un errore del server e una regola perfettamente funzionante?

[Risposta accettata] Grazie a Gumbo sono stato in grado di approssimare una soluzione usando rewritecond:

rewritecond %{REQUEST_URI} !\.[^/]+$
rewriterule (.+) $1/index.html [L]

Funziona, ma filtra più di un semplice .html: potrebbe bloccare altre pagine. Purtroppo,

rewritecond %{REQUEST_URI} !\.html$

genera un errore del server:

  

La richiesta ha superato il limite di 10 reindirizzamenti interni a causa di un probabile errore di configurazione. Utilizza "LimitInternalRecursion" per aumentare il limite, se necessario.

Mi piacerebbe ancora sapere perché:

rewriterule ^(.*(?!html))$ $1/index.html [L]

si traduce in un ciclo. La prima metà dovrebbe verificare se non termina in .html. Dalla seconda metà aggiunge .html, sembra l'equivalente funzionale di:

while(substr($address,-4)!='html') $address.='html'

Ovviamente mi manca qualcosa.

È stato utile?

Soluzione

Utilizza una direttiva RewriteCond per verificare se il percorso dell'URL non termina con un .html :

RewriteCond %{REQUEST_URI} !\.html$
RewriteRule ^(.*[^/])?/?$ $1/index.html [L]

Modifica & nbsp; & nbsp; & nbsp; Stai & # 8217; stai usando un'asserzione di previsione ( (?! & # 8230;) ). Ma non c'è niente dopo . * (solo un $ ). Prova invece un'affermazione retrospettiva:

RewriteRule ^.*$(?<!html) <*>/index.html [L]

Ma nota che probabilmente hai bisogno di Apache 2.2 per usare queste affermazioni.

Altri suggerimenti

Bene, per farlo funzionare davvero, potresti semplicemente usare un lookbehind invece di un lookahead:

RewriteRule ^(.*)(?<!html)$ $1/index.html [L]

Non sono sicuro del perché l'aggiunta della 'x' funzioni, lo modificherò se lo capissi.

Per quale motivo l'aggiunta di x lo fa funzionare: Se la sostituzione corrisponderà al regex, RewriteRule verrà nuovamente applicato. Ad esempio, ciò provoca un errore:

RewriteRule ^(.*)$ $1.rb

perché sostituirebbe script con script.rb . Corrisponde alla regex, quindi sostituisce script.rb con script.rb.rb , ancora e ancora ...

Questo è accennato nel registro degli errori:

Request exceeded the limit of 10 internal redirects due to probable configuration error. Use 'LimitInternalRecursion' to increase the limit if necessary.

Nel tuo esempio, aggiungi index.html alla fine. Quando c'è un x alla fine del regex, allora non corrisponderà alla tua sostituzione, che termina in un l .

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top