Vraag Omleiden, URL's wijzigen of HTTP omleiden naar HTTPS in Apache - alles wat u altijd al wilde weten over Mod_Rewrite-regels, maar niet durfde vragen


Dit is een Canonical Question over de mod_rewrite van Apache.

Het wijzigen van een verzoek-URL of het omleiden van gebruikers naar een andere URL dan degene die ze aanvankelijk hebben aangevraagd, wordt gedaan met mod_rewrite. Dit omvat dingen als:

  • Van HTTP naar HTTPS veranderen (of andersom)
  • Een aanvraag wijzigen naar een pagina die niet meer bestaat naar een nieuwe vervanging.
  • Een URL-indeling wijzigen (zoals? Id = 3433 tot / id / 3433)
  • Een andere pagina presenteren op basis van de browser, gebaseerd op de verwijzer, gebaseerd op alles wat mogelijk is onder de maan en de zon.
  • Alles wat u met URL wilt rondsnuffelen

Alles wat u ooit wilde weten over Mod_Rewrite-regels, maar niet durfde vragen!

Hoe kan ik een expert worden in het schrijven van mod_rewrite-regels?

  • Wat is het fundamentele formaat en de structuur van mod_rewrite-regels?
  • Van welke vorm / smaak van reguliere expressies moet ik een goed begrip hebben?
  • Wat zijn de meest voorkomende fouten / valkuilen bij het schrijven van herschrijfregels?
  • Wat is een goede methode voor het testen en verifiëren van mod_rewrite-regels?
  • Zijn er SEO- of prestatie-implicaties van mod_rewrite-regels waar ik op moet letten?
  • Zijn er veel voorkomende situaties waarin mod_rewrite misschien wel het juiste hulpmiddel voor de taak lijkt, maar niet?
  • Wat zijn enkele veelvoorkomende voorbeelden?

Een plaats om uw regels te testen

De htaccess-tester website is een geweldige plek om rond te spelen met uw regels en ze te testen. Het toont zelfs de debug-uitvoer, zodat u kunt zien wat overeenkomt en wat niet.


257
2017-12-20 16:59


oorsprong


Het idee achter deze vraag is om een ​​eindeloze weg te banen voor alle eindeloze mod_rewrite vragen die onze meer regelmatige gebruikers gek maken. Dit lijkt erg op wat is gedaan met subnetting op serverfault.com/questions/49765/how-does-subnetting-work . - Kyle Brandt♦
Ik wil ook niet echt teveel upvotes hierover vraagliever moeten ze naar het antwoord gaan. Ik wil dit niet CW want ik wil zeker weten dat de poster de eer krijgt van wat ik hoop dat het is mod_rewrite answer om alle vragen mod_rewrite te beëindigen. - Kyle Brandt♦
Sorry, ik heb de vraag opgewaardeerd. ;-) Ik denk echt dat het moet verschijnen op (of in de buurt van) de bovenkant van mod-rewrite tag zoekopdrachten / filters. - Steven Monday
Iemand anders (tm) zou de gebruikelijke use-cases moeten afhandelen. Ik ken ze niet goed genoeg om het recht te doen. - sysadmin1138♦
Misschien moet deze vraag worden gekoppeld aan de mod-rewrite-tagwiki om het pad nog korter te maken. - beldaz


antwoorden:


syntaxis van mod_rewrite

mod_rewrite heeft een aantal specifieke regels voor het ordenen die de verwerking beïnvloeden. Voordat er iets wordt gedaan, is het RewriteEngine On richtlijn moet worden gegeven omdat dit mod_rewrite-verwerking inschakelt. Dit zou vóór alle andere herschrijfrichtlijnen moeten zijn.

RewriteCond voorafgaande RewriteRule maakt die ene regel onderworpen aan de voorwaardelijke. Alle volgende RewriteRules worden verwerkt alsof ze niet waren onderworpen aan voorwaardelijke bepalingen.

RewriteEngine On
RewriteCond %{HTTP_REFERER}          ^https?://serverfault\.com(/|$)
RewriteRule $/blog/(.*)\.html        $/blog/$1.sf.html

In dit eenvoudige geval, als de HTTP-verwijzende URL afkomstig is van serverfault.com, stuur dan blogverzoeken om naar speciale serverfault-pagina's (we zijn gewoon zo speciaal). Als het bovenstaande blok echter een extra RewriteRule-regel had:

RewriteEngine On
RewriteCond %{HTTP_REFERER}          ^https?://serverfault\.com(/|$)
RewriteRule $/blog/(.*)\.html        $/blog/$1.sf.html
RewriteRule $/blog/(.*)\.jpg         $/blog/$1.sf.jpg

Alle JPG-bestanden zouden naar de speciale pagina's voor serverfault gaan, niet alleen degene met een verwijzer die aangeeft dat deze van hieruit kwamen. Dit is duidelijk niet de bedoeling van hoe deze regels worden geschreven. Het zou kunnen worden gedaan met meerdere RewriteCond-regels:

RewriteEngine On
RewriteCond %{HTTP_REFERER}          ^https?://serverfault\.com(/|$)
RewriteRule ^/blog/(.*)\.html        /blog/$1.sf.html
RewriteCond %{HTTP_REFERER}          ^https?://serverfault\.com(/|$)
RewriteRule ^/blog/(.*)\.jpg         /blog/$1.sf.jpg

Maar waarschijnlijk moet worden gedaan met een lastiger vervangingssyntaxis.

RewriteEngine On
RewriteCond %{HTTP_REFERER}                ^https?://serverfault\.com(/|$)
RewriteRule ^/blog/(.*)\.(html|jpg)        /blog/$1.sf.$2

De meer complexe RewriteRule bevat de conditionals voor verwerking. De laatste haakjes, (html|jpg) vertelt RewriteRule om voor een van beiden overeen te komen html of jpg, en om de overeenkomende reeks weer te geven als $ 2 in de herschreven reeks. Dit is logisch identiek aan het vorige blok, met twee RewriteCond / RewriteRule-paren, het doet het alleen op twee regels in plaats van vier.

Meerdere RewriteCond-regels zijn impliciet ANDed en kunnen expliciet ORED zijn. Om verwijzingen van zowel ServerFault als Supergebruiker af te handelen (expliciete OF):

RewriteEngine On
RewriteCond %{HTTP_REFERER}                ^https?://serverfault\.com(/|$)    [OR]
RewriteCond %{HTTP_REFERER}                ^https?://superuser\.com(/|$)
RewriteRule ^/blog/(.*)\.(html|jpg)        /blog/$1.sf.$2

Server-serververvangde pagina's bedienen met Chrome-browsers (impliciete AND):

RewriteEngine On
RewriteCond %{HTTP_REFERER}                ^https?://serverfault\.com(/|$)
RewriteCond %{HTTP_USER_AGENT}             ^Mozilla.*Chrome.*$
RewriteRule ^/blog/(.*)\.(html|jpg)        /blog/$1.sf.$2

RewriteBase is ook afhankelijk van de bestelling, aangezien deze specificeert hoe volgend RewriteRule richtlijnen verwerken hun verwerking. Het is erg handig in .htaccess-bestanden. Indien gebruikt, zou dit de eerste richtlijn moeten zijn onder "RewriteEngine aan" in een .htaccess-bestand. Neem dit voorbeeld:

RewriteEngine On
RewriteBase /blog
RewriteCond %{HTTP_REFERER}           ^https?://serverfault\.com(/|$)
RewriteRule ^(.*)\.(html|jpg)         $1.sf.$2

Dit is mod_rewrite aan het vertellen dat deze specifieke URL die op dit moment wordt verwerkt, is aangekomen via http://example.com/blog/ in plaats van het fysieke directorypad (/ home / $ Username / public_html / blog) en dienovereenkomstig te behandelen. Vanwege dit, de RewriteRule is van mening dat het de string-start is om achter het "/ blog" in de URL te staan. Hier is hetzelfde geschreven op twee verschillende manieren. Een met RewriteBase, de andere zonder:

RewriteEngine On

##Example 1: No RewriteBase##
RewriteCond %{HTTP_REFERER}                                   ^https?://serverfault\.com(/|$)
RewriteRule /home/assdr/public_html/blog/(.*)\.(html|jpg)     $1.sf.$2

##Example 2: With RewriteBase##
RewriteBase /blog
RewriteCond %{HTTP_REFERER}           ^https?://serverfault\.com(/|$)
RewriteRule ^(.*)\.(html|jpg)         $1.sf.$2

Zoals je kunt zien, RewriteBase maakt herschrijfregels mogelijk om het web te gebruikenplaats pad naar inhoud in plaats van het internetserver, wat ze begrijpelijker kan maken voor degenen die dergelijke bestanden bewerken. Ook kunnen ze de richtlijnen korter maken, wat een esthetische aantrekkingskracht heeft.


De syntaxis van RewriteRule-overeenkomsten

RewriteRule zelf heeft een complexe syntaxis voor het matchen van strings. Ik bedek de vlaggen (dingen zoals [PT]) in een ander gedeelte. Omdat Sysadmins vaker door voorbeelden leren dan door het lezen van een man-page Ik zal voorbeelden geven en uitleggen wat ze doen.

RewriteRule ^/blog/(.*)$    /newblog/$1

De .* constructie komt overeen met elk willekeurig teken (.) nul of meer keren (*). Als u het tussen haakjes invoegt, wordt dit gegeven om de tekenreeks op te geven die is gekoppeld aan de variabele $ 1.

RewriteRule ^/blog/.*/(.*)$  /newblog/$1

In dit geval is de eerste. * NIET tussen parensies ingesloten en dus niet verstrekt aan de herschreven reeks. Deze regel verwijdert een directoryniveau op de nieuwe blog-site. (/blog/2009/sample.html wordt /newblog/sample.html).

RewriteRule ^/blog/(2008|2009)/(.*)$   /newblog/$2

In dit geval stelt de eerste haakjesexpressie een overeenkomende groep in. Dit wordt $ 1, wat niet nodig is en daarom niet wordt gebruikt in de herschreven reeks.

RewriteRule ^/blog/(2008|2009)/(.*)$   /newblog/$1/$2

In dit geval gebruiken we $ 1 in de herschreven reeks.

RewriteRule ^/blog/(20[0-9][0-9])/(.*)$   /newblog/$1/$2

Deze regel gebruikt een speciale beugelsyntaxis die een teken specificeert reeks. [0-9] komt overeen met de cijfers 0 tot en met 9. Deze specifieke regel behandelt jaren tussen 2000 en 2099.

RewriteRule ^/blog/(20[0-9]{2})/(.*)$  /newblog/$1/$2

Dit doet hetzelfde als de vorige regel, maar het gedeelte {2} vertelt het om het vorige teken (een haakse uitdrukking in dit geval) twee keer overeen te laten komen.

RewriteRule ^/blog/([0-9]{4})/([a-z]*)\.html   /newblog/$1/$2.shtml

Deze case komt overeen met een kleine letter in de tweede overeenkomende expressie en doet dit voor zoveel tekens als het kan. De \. construct vertelt het om de periode als een feitelijke periode te behandelen, niet het speciale karakter dat het is in de vorige voorbeelden. Het zal echter breken als de bestandsnaam streepjes bevat.

RewriteRule ^/blog/([0-9]{4})/([-a-z]*)\.html  /newblog/$1/$2.shtml

Dit houdt bestandsnamen met streepjes erin vast. Echter, als - is een speciaal teken in haakjesuitdrukkingen, het moet de eerste karakter in de uitdrukking.

RewriteRule ^/blog/([0-9]{4})/([-0-9a-zA-Z]*)\.html   /newblog/$1/$2.shtml

In deze versie worden alle bestandsnamen met letters, cijfers of de - teken in de bestandsnaam. Dit is hoe u meerdere tekensets opgeeft in een haakerexpressie.


RewriteRule-vlaggen

De vlaggen op herschrijfregels hebben een groot aantal speciale betekenissen en usecases.

RewriteRule ^/blog/([0-9]{4})/([-a-z]*).\html  /newblog/$1/$2.shtml  [L]

De vlag is de [L] aan het einde van de bovenstaande uitdrukking. Meerdere vlaggen kunnen worden gebruikt, gescheiden door een komma. De gekoppelde documentatie beschrijft elk, maar hier zijn ze hoe dan ook:

L = Laatste. Stop met het verwerken van RewriteRules zodra deze overeenkomt. Bestelling telt!
C = Ketting. Ga door met het verwerken van de volgende RewriteRule. Als deze regel niet overeenkomt, wordt de volgende regel niet uitgevoerd. Hierover later meer.
E = Stel omgevingsvariabele in. Apache heeft verschillende omgevingsvariabelen die het gedrag van webserver kunnen beïnvloeden.
F = Verboden. Retourneert een fout 403-Forbidden als deze regel overeenkomt.
G = Verdwenen. Retourneert een 410-fout als deze regel overeenkomt.
H = Handler. Forceert dat het verzoek wordt afgehandeld alsof het het opgegeven MIME-type is.
N = Volgende. Forceert de regel om opnieuw te beginnen en opnieuw overeen te komen. DOE VOORZICHTIG! Er kunnen lussen optreden.
NC = Geen geval. Hiermee jpg om zowel JPG als JPG te matchen.
NE = Geen ontsnapping. Voorkomt het herschrijven van speciale tekens (.? # & Etc) in hun hex-code-equivalenten.
NS = Geen subvragen. Als u server-side-includes gebruikt, voorkomt dit overeenkomsten met de opgenomen bestanden.
P = Proxy. Forceert dat de regel wordt afgehandeld door mod_proxy. Transparant inhoud leveren van andere servers, omdat uw webserver dit ophaalt en opnieuw gebruikt. Dit is een gevaarlijke vlag, want een slecht geschreven zal je webserver veranderen in een open-proxy en dat is slecht.
PT = Doorgeven. Houd rekening met Alias-instructies in RewriteRule-overeenkomsten.
QSA = QSAppend. Wanneer de originele tekenreeks een query bevat (http://example.com/thing?asp=foo) voeg de originele querystring toe aan de herschreven reeks. Normaal gesproken zou het worden weggegooid. Belangrijk voor dynamische inhoud.
R = Doorverwijzing. Geef een HTTP-omleiding op naar de opgegeven URL. Kan ook exacte omleidingscode [R = 303] bieden. Zeer vergelijkbaar met RedirectMatch, die sneller is en waar mogelijk moet worden gebruikt.
S = Overslaan. Sla deze regel over.
T = Type. Geef het mime-type op van de geretourneerde inhoud. Zeer vergelijkbaar met de AddType richtlijn.

Je weet hoe ik dat zei RewriteCond is van toepassing op één en slechts één regel? Wel, je kunt dat omzeilen door te ketenen.

RewriteEngine On
RewriteCond %{HTTP_REFERER}          ^https?://serverfault\.com(/|$)
RewriteRule ^/blog/(.*)\.html        /blog/$1.sf.html     [C]
RewriteRule ^/blog/(.*)\.jpg         /blog/$1.sf.jpg

Omdat de eerste RewriteRule de Chain-vlag heeft, zal de tweede herschrijfregel worden uitgevoerd wanneer de eerste herschrijft, namelijk wanneer de vorige RewriteCond-regel is vergeleken. Handig als Apache reguliere expressies je hersenen pijn doen. De alles-in-een-regelmethode waarnaar ik in de eerste sectie wijs, is echter sneller vanuit een oogpunt van optimalisatie.

RewriteRule ^/blog/([0-9]{4})/([-0-9a-zA-Z]*)\.html   /newblog/$1/$2.shtml

Dit kan eenvoudiger worden gemaakt door middel van vlaggen:

RewriteRule ^/blog/([0-9]{4})/([-0-9a-z]*)\.html   /newblog/$1/$2.shtml   [NC]

Sommige vlaggen zijn ook van toepassing op RewriteCond. Met name NoCase.

RewriteCond %{HTTP_REFERER}        ^https?://serverfault\.com(/|$)     [NC]

Komt overeen met "ServerFault.com"


219
2017-12-20 17:44



Goed gedaan. [Vulmiddel] - EEAA
Heel aardig mod_rewrite en regex-primer. 1. - Steven Monday
Het is soms handig om te weten dat het RewriteCond wordt daadwerkelijk verwerkt na de RewriteRule is gekoppeld. Misschien wil je daar 'daarover meer meer' zeggen dicht bij de top waar je zegt: "RewriteCond voorafgaand aan RewriteRule maakt die ene regel onderworpen aan het voorwaardelijke." Je zou willen vermelden dat de regexes Perl-compatibele reguliere expressies zijn. Ook heb je een externe apostrof in "... de RewriteRule beschouwt het als een snarenstart ..." - Dennis Williamson
RewriteRule ^/blog/.*/(.*)$ /newblog/$1 komt niet overeen met de eerste mapcomponent - rewriterules zijn standaard inhalig. /.*/(.*) komt overeen met beide / 1 / (2) / en / 1/2/3/4/5 / (6) /, dus je moet / [^ /] * / gebruiken om alleen het EERSTE pad te matchen component. - adaptr
@ sysadmin1138, ik denk dat dit antwoord goed is, maar het kan beter zijn als je meer uitleg geeft over de vlaggen E, N, NS, P, PT en S met voorbeelden omdat die vlaggen niet duidelijk zijn hoe ze werken enz. - Pacerier


Wat is het fundamentele formaat en   structuur van mod_rewrite regels?

Ik zal uitstellen naar het uitstekende antwoord van sysadmin1138 op deze punten.

Welke vorm / smaak heeft regulier   uitdrukkingen moet ik een solide hebben   greep van?

Naast de syntaxisvolgorde, syntaxisvergelijkende / reguliere expressies en RewriteRule-vlaggen die zijn beschreven door sysadmin1138, geloof ik dat het vermeldt dat mod_rewrite Apache omgevingsvariabelen blootstelt op basis van HTTP-verzoekheaders en de configuratie van Apache.

ik zou aanraden AskApache's Mod_rewrite Debug Zelfstudie voor een uitgebreide lijst met variabelen die mogelijk beschikbaar zijn voor mod_rewrite.

Wat zijn de meest voorkomende   fouten / valkuilen bij het schrijven van herschrijven   reglement?

De meeste problemen met RewriteRule's komen voort uit een misverstand over de syntaxis / fout van PCRE om speciale tekens te laten ontsnappen of een gebrek aan inzicht in de inhoud van de variabele (n) gebruikt voor het matchen.

Typische problemen en aanbevolen troubleshooting:

  • 500 Interne server fout - Verwijder Windows-wagenbesturingselementen in configuratiebestand (en) indien aanwezig, zorg ervoor dat mod_rewrite is ingeschakeld (voeg richtlijnen in IfModule Voorwaardelijk om dit scenario te vermijden), controleer de syntaxis van de richtlijn, geef commentaar over richtlijnen totdat het probleem is geïdentificeerd
  • Omleidingslus - Maak gebruik van RewriteLog en RewriteLogLevel, geef richtlijnen uit totdat het probleem is geïdentificeerd

Wat is een goede methode om te testen en   de mod_rewrite-regels verifiëren?

Bekijk eerst de inhoud van de omgevingsvariabelen die u wilt vergelijken: als u PHP hebt geïnstalleerd, is dit net zo eenvoudig als het toevoegen van het volgende blok aan uw toepassing:

<?php
  var_dump($_SERVER);
?>

... schrijf vervolgens uw regels (bij voorkeur voor testen op een ontwikkelserver) en noteer elke inconsistente overeenkomst of activiteit in uw Apache ErrorLog het dossier.

Gebruik voor moderere regels mod_rewrite's RewriteLog richtlijn om activiteiten naar een bestand te loggen en in te stellen RewriteLogLevel 3

Zijn er SEO of prestaties   implicaties van mod_rewrite-regels I   moet je je bewust zijn van?

AllowOverride all beïnvloedt de serverprestaties zoals Apache moet controleren .htaccess bestanden en parseer richtlijnen bij elke aanvraag - bewaar indien mogelijk alle richtlijnen in de VirtualHost-configuratie voor uw site of schakel in .htaccess overschrijft alleen voor de mappen die ze nodig hebben.

Google's Richtlijnen voor webmasters expliciet vermelden: "Bedrieg uw gebruikers niet of presenteer verschillende inhoud aan zoekmachines dan aan gebruikers wordt getoond, wat gewoonlijk 'cloaking' wordt genoemd. - vermijd het maken van mod_rewrite-richtlijnen die filteren voor robots van zoekmachines.

Zoekrobots geven de voorkeur aan een 1: 1-inhoud: URI-toewijzing (dit is de basis voor het rangschikken van koppelingen naar inhoud) - als u mod_rewrite gebruikt om tijdelijke omleidingen te maken of als u dezelfde inhoud weergeeft onder meerdere URI's, kunt u overwegen een canonieke URI in uw HTML-documenten.

Zijn er veel voorkomende situaties waar   mod_rewrite lijkt misschien het goede   hulpmiddel voor de klus, maar is het niet?

Dit is een enorm (en potentieel controversieel) onderwerp op zich - beter (IMHO) om het gebruik van geval tot geval aan te pakken en laat de vraagstellers bepalen of de voorgestelde resoluties geschikt zijn voor hun behoeften.

Wat zijn enkele veelvoorkomende voorbeelden?

De mod_rewrite Tricks and Tips van AskApache omvat zowat elke gebruikelijke use-case die regelmatig opduikt, maar de "juiste" oplossing voor een bepaalde gebruiker kan afhangen van de verfijning van de configuratie van de gebruiker en de bestaande richtlijnen (daarom is het in het algemeen een goed idee om te zien welke anders richtlijnen die een gebruiker heeft ingesteld wanneer een mod_rewrite-vraag wordt weergegeven).


38
2017-12-21 01:00



Bedankt voor de AskApache-link. Het is wat ik zocht! - sica07
De AskApache-clown wordt officieel niet ondersteund door de ASF. Veel van wat hij zegt is discutabel of gewoon verkeerd. - adaptr
@adaptr Deel de superieure bronnen waarvan u zich blijkbaar bewust bent. - danlefree
"veel voorkomende situaties waarin mod_rewrite misschien wel het juiste hulpmiddel voor de klus lijkt, maar dat niet is?" - eenvoudig omleidingen, waarbij mod_rewrite nog niet wordt gebruikt. Gebruik mod_alias Redirect of RedirectMatch in plaats daarvan. Zie ook de Apache-documenten: Wanneer mod_rewrite niet wordt gebruikt - MrWhite


Net als vele andere beheerders / ontwikkelaars heb ik jarenlang de fijne kneepjes van de herschrijfregels bestreden en ben ik niet tevreden met de bestaande Apache-documentatie, dus besloot ik als een persoonlijk project om uit te zoeken hoe mod_rewrite werkt eigenlijk en werkt samen met de rest van de Apache-kern, dus de afgelopen paar maanden heb ik testcases bijgetest strace + boren in de broncode om hier grip op te krijgen.

Hier volgen enkele belangrijke opmerkingen die regelontwikkelaars moeten heroverwegen om te overwegen:

  • Sommige aspecten van herschrijven zijn gemeenschappelijk voor serverconfiguratie, virtuele host, directory, .htaccess-verwerking echter
  • Sommige bewerkingen zijn heel anders voor de rootconfiguratie (serverconfiguratie, virtuele host en directory) in tegenstelling tot de PerDir (.htaccess) verwerken.
  • Erger nog, omdat PerDir-verwerking vrijwel willekeurig INTERNE REDIRECT-cyclussen kan activeren, moeten de rootconfiguratie-elementen worden geschreven, zich ervan bewust dat dergelijke PerDir-verwerking dit kan activeren.

Ik zou willen zeggen dat je hierdoor de herschreven gebruikersgemeenschappen bijna in twee categorieën moet splitsen en ze als volledig apart moet behandelen:

  • Degenen met roottoegang tot de Apache-configuratie. Dit zijn meestal admin / ontwikkelaars met een toepassingsgerichte server / VM, en het bericht hier is vrij eenvoudig: vermijd het gebruik .htaccess bestanden indien mogelijk; doe alles in je server of vhost config. Foutopsporing is redelijk eenvoudig omdat de ontwikkelaar foutopsporing kan instellen en toegang heeft tot de bestanden rewrite.log.

  • Gebruikers van een gedeelde gehoste service (SHS).

    • Dergelijke gebruikers hebben gebruiken .htaccess / Perdir-verwerking aangezien er geen alternatief beschikbaar is.
    • Erger nog, het vaardigheidsniveau van dergelijke gebruikers (voor zover het gebruik van de regexp-gedreven ladder-logica van mod_rewrite) is over het algemeen aanzienlijk minder dan ervaren beheerders.
    • Apache en de hostingproviders bieden geen ondersteuning voor foutopsporing / diagnose. De enige diagnostische informatie is een succesvolle omleiding, een omleiding naar de verkeerde URI. of een 404/500 statuscode. Dit laat hen verward en hulpeloos.
    • Apache is extreem zwak en legt uit hoe herschrijven werkt voor dit gebruik. Het geeft bijvoorbeeld geen duidelijke uitleg over wat PerDir .htaccessbestand is geselecteerd en waarom. Het verklaart niet de fijne kneepjes van PerDir-fietsen en hoe dit te voorkomen.

Er is mogelijk een derde gemeenschap: administratief en ondersteunend personeel bij SHS-aanbieders die in beide kampen een voet in de aarde krijgen en de gevolgen van het bovenstaande moeten ondergaan.

Ik heb een aantal blogposts in artikelstijl geschreven (bijv Meer over het gebruik van Rewrite-regels in .htaccess-bestanden) die veel gedetailleerde punten behandelt die ik hier niet zal herhalen om deze post kort te houden. Ik heb mijn eigen shared service en ondersteun ook enkele speciale & VM FLOSS-projecten. Ik begon met het gebruik van een standaard LAMP VM als testvoertuig voor mijn SHS-account, maar uiteindelijk vond ik het beter om een ​​goede mirror VM te maken (beschreven hier).

Echter, in termen van hoe de beheerdersgemeenschap zou moeten ondersteunen .htaccess gebruikers, ik vind dat we ons moeten ontwikkelen en aanbieden:

  • Een coherente beschrijving van hoe het herschrijfsysteem daadwerkelijk werkt in PerDir-verwerking
  • Een set richtlijnen / beste werkwijzen over hoe te schrijven .htaccess regels herschrijven
  • Een eenvoudige webgebaseerde herschrijfscriptparser die lijkt op de W3C html-parsers, maar waarmee gebruikers test-URI's of testvectoren van dezelfde kunnen invoeren en een onmiddellijk logboek van de herschrijflogica-flow krijgen /
  • Tips voor het verkrijgen van ingebouwde diagnostiek van uw regels (bijv.

    • Gebruik [E=VAR:EXPR] gebruik maken van het feit dat EXPR zal backreferences ($ N of% N) uitbreiden om ze beschikbaar te maken als diagnostiek voor het doelscript.
    • Als u lokaal uw herschrijfregels bestelt met de vlaggen [OR], [C], [SKIP] en ​​[L], zodat het hele herschrijfschema werkt zonder de noodzaak om interne doorverwijzing te gebruiken, dan kunt u het volgende als regel 1 toevoegen om alle lus gedoe te voorkomen:

      RewriteCond %{ENV:REDIRECT_STATUS} !=""
      RewriteRule .  -  [L]
      

21
2018-01-14 16:50



Dit is goed gedocumenteerd. Waarom zegt u dat de documentatie dit niet verklaart? - adaptr
Het enige wat je hoeft te doen is je te abonneren op de .htaccess onderwerpen en je zult zien. De meeste beginners raken hopeloos in de war - de meeste van hen hebben hun eerste ervaring met een LAMP-service en mod_rewrite op een gedeelde service en hebben daarom geen root-toegang tot het systeem / vhost configs en moeten deze per dir-verwerking gebruiken via .htaccessbestanden. Er zijn belangrijke verschillen die de beginner moet "bloeden". Ik beschouw mezelf als een power-user en ben nog steeds subtiliteiten aan het ontdekken. Zoals ik zei, ik moest strace en broncode scannen gebruiken om een ​​aantal aspecten uit te werken. Dat zou niet nodig zijn. :-( - TerryE
Ik ben het er helemaal mee eens. "We moeten de herschreven gebruikersgemeenschappen opsplitsen in twee categorieën en ze als volledig gescheiden beschouwen." Sommige gebruikers gebruiken shared hosting en nodig hebben op vertrouwen .htaccess, wat vreselijk fragiel, ingewikkeld en verwarrend is, zelfs voor experts. Ik heb NOG STEEDS problemen. - Ryan


Gebruik van rewritemap

Er zijn veel dingen die je kunt doen met rewritemaps. Rewritemaps worden gedeclareerd met behulp van de Rewritemap-richtlijn en kunnen vervolgens worden gebruikt in RewritCond-evaluaties en in RewriteRule-subsituties.

De algemene syntaxis voor RewriteMap is:

RewriteMap MapName MapType:MapSource

Bijvoorbeeld:

RewriteMap examplemap txt:/path/to/file/map.txt

U kunt dan de mapnaam gebruiken voor constructies als deze:

${examplemap:key}

De kaart bevat sleutel / waarde-paren. Als de sleutel wordt gevonden, wordt de waarde vervangen. Eenvoudige kaarten zijn gewoon tekstbestanden, maar u kunt hash-kaarten en zelfs SQL-query's gebruiken. Meer details zijn te vinden in de documenten:

http://httpd.apache.org/docs/2.2/mod/mod_rewrite.html#rewritemap

Ontsnappende snaren.

Er zijn vier interne kaarten die u kunt gebruiken om een ​​aantal bewerkingen uit te voeren. Vooral ontwijfelbare snaren kunnen van pas komen.

Bijvoorbeeld: ik wil testen op de tekenreeks "café" in de queryreeks. De browser zal hier echter aan ontsnappen voordat hij het naar mijn server verzendt, dus ik zal moeten uitzoeken wat de URL-escapeversie is voor elke reeks die ik wil evenaren, of ik kan hem gewoon ontkoppelen ...

RewriteMap unescape int:unescape

RewriteCond %{QUERY_STRING}  (location|place)=(.*)
RewriteCond ${unescape:%2}   café
RewriteRule ^/find/$         /find/1234? [L,R]

Merk op hoe ik een RewriteCond gebruik om het argument voor de queryparameter voor de vraag vast te leggen en vervolgens de kaart in de tweede rewriteCond te gebruiken om het te ontrafelen. Dit wordt dan vergeleken. Merk ook op hoe ik% 2 als sleutel in de rewritemap nodig heb, aangezien% 1 ofwel "locatie" of "plaats" bevat. Wanneer u haakjes gebruikt om patronen te groeperen, worden deze ook vastgelegd, of u van plan bent om het resultaat van de capture te gebruiken of niet ...


15
2018-04-06 11:57



De laatste zin is niet helemaal waar. De mod_rewrite regexp-engine ondersteunt niet-vastleggende groepen zoals (?:location|place) en dit zal slechts één opname in het voorbeeld hebben. - TerryE


Wat zijn de meest voorkomende   fouten / valkuilen bij het schrijven van herschrijven   reglement?

Een heel eenvoudige valkuil is wanneer u URL's herschrijft die het schijnbare pad wijzigen, bijvoorbeeld van /base/1234/index.html naar /base/script.php?id=1234. Alle afbeeldingen of CSS met relatieve paden naar de scriptlocatie worden niet gevonden door de client. Een aantal opties om dit op te lossen is te vinden op deze faq.


12
2018-01-01 04:02



Bedankt voor de link. Vooral wanneer ik met andere teamleden werk die niet vertrouwd zijn met herschrijven, vind ik het toevoegen van een <base> tag is het gemakkelijkst om te volgen en toch relatieve paden in te schakelen. - kontur