Vra

Ek wil graag mod herskryf in gebruik te webblad adresse omskep soos / directory /directory/index.html , in 'n standaard LAMP hosting situasie. Wat ek die werke vir adresse wat eindig in 'n streep. Ek kan 'n manier vind nie om te hanteer adresse wat 'n streep nie die einde nie .

Wat lyk soos dit moet werk is:

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

Maar die tweede lyn veroorsaak dat 'n 500-bediener fout. As ek 'n enkele brief voeg x tot die tweede lyn:

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

Dit begin om te werk, maar net vir directory name wat eindig in 'n x . Ek het probeer om die vervanging van die x met baie verskillende dinge. Enigiets meer ingewikkeld as 'n werklike karakters (soos [^ x] of. +) Gee 'n 500-bediener fout.

En, om my eie nuuskierigheid te bevredig, Is daar iemand weet waarom die byvoeging van 'n enkele ware brief maak die verskil tussen 'n bediener fout en 'n perfek funksionering reël?

[Aanvaar antwoord] Danksy Gumbo Ek was in staat om 'n oplossing met behulp van rewritecond benader:

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

Dit werk, maar filters meer as net Html - dit kan ander bladsye te sluit. Ongelukkig

rewritecond %{REQUEST_URI} !\.html$

resultate in 'n bediener fout:

  

Versoek oorskry die limiet van 10 interne aansture as gevolg van moontlike opset fout. Gebruik 'LimitInternalRecursion' tot die uiterste te verhoog, indien nodig.

Ek wil nog graag wou weet hoekom:

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

resultate in 'n lus. Die eerste helfte is veronderstel om as dit kyk nie einde in Html. Sedert die tweede helfte voeg Html, dit lyk asof die funksionele ekwivalent van:

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

Dit is duidelik dat ek mis iets.

Was dit nuttig?

Oplossing

Gebruik 'n RewriteCond richtlijn om te kyk of die URL pad eindig nie met 'n .html:

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

Edit jy 'n blik lig bewering ((?!…)). Maar daar is niks na .* (net 'n $). So probeer om 'n blik-agter bewering plaas:

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

Maar daarop dat jy waarskynlik nodig Apache 2.2 om hierdie stellings te gebruik.

Ander wenke

Wel, vir eintlik maak dit werk, jy kan net gebruik om 'n negatiewe lookbehind in plaas van 'n look ahead:

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

Ek is nie seker onvoorbereid waarom die byvoeging van die 'x' maak dit werk, ek sal wysig of ek dit uitwerk.

Vir waarom die byvoeging van die x maak dit werk: As die vervanging van die regex sal pas, sal die RewriteRule weer toegepas word. As 'n voorbeeld, dit veroorsaak 'n fout:

RewriteRule ^(.*)$ $1.rb

omdat dit script sou vervang met script.rb. Wat ooreenstem met die regex, so dit vervang script.rb met script.rb.rb, weer en weer ...

Dit is te kenne gegee in die fout log:

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

In jou voorbeeld, jy index.html voeg tot die einde toe. Wanneer daar 'n x aan die einde van die regex, dan sal dit nie ooreenstem met jou plaasvervanger, wat eindig in 'n l.

Gelisensieer onder: CC-BY-SA met toeskrywing
Nie verbonde aan StackOverflow
scroll top