OwnCloud Část 1: Instalace a nastavení

Mám webovou prezentaci s některými typickými adresami URL. Nyní musím přidat přepisovací řád pro různé jazyky, příklady:

domain/club -> do not change domain/club/path -> do not change domain/club/path?search=somethingelse -> do not change domain/en/club -> domain/club?lang=en domain/en/club/path -> domain/club/path?lang=en domain/en/club/path?search=something -> domain/club/path?search=something&lang=endomain 

Můj nápad byl rozdělit to do skupin doména / jazyk / klub / cesta? Hledat = něco a pak psát

RewriteRule \/(?[a-zA-Z]{2})\/club\/?(?.*)\?(?.*) /club/$1?search=$2&lang=$3 

ale to nebude považovat řetězce bez ?. Také nevím, jak vyřešit rozdíl dvěma případy ?lang= a &lang=. Nenašel jsem nic online.

Dělám to na existujícím rámci PHP (nikoli na žádném ze standardů), a proto to musím udělat tímto způsobem (rozumějte s těmito konkrétními adresami URL).

  • Předpokládám, že „přidejte přepisovatel“, které si přejete interně přepsat požadavek na rozdíl od externě přesměrovat? (RewriteRule dělá obojí.)

Vypadá to, že to děláte složitější, než ve skutečnosti je. Pokud se nemusíte konkrétně shodovat s výrazem „klub“, vypadá to, že stačí odstranit první segment cesty, když vypadá jako dvoupísmenný jazykový kód, a přesunout jej do lang Místo toho parametr URL v řetězci dotazu.

Za tímto účelem můžete v horní části obrazovky provést následující .htaccess soubor:

RewriteRule ^([a-z]{2})/(.+) $2?lang=$1 [QSA,L] 

Žádost o /en/club bude přepsán na /club?lang=en a /en/club/path?search=something na /club/path?lang=en&search=something (všimněte si lang Parametr URL je první).

Vysvětlení:

  • The RewriteRule vzor odpovídá pouze cestě URL, nikoli řetězci dotazu. Cesta URL, která je shodná, také nemá předponu lomítka.
  • ([a-z]{2}) - odpovídá 2písmennému (malému) jazykovému kódu. (Ačkoli jste ve svém regulárním výrazu povolili také velká písmena?) Toto je podvzorek pro zachycení, takže je přirozeně uložen v (prvním) $1 zpětná reference.
  • The (.+) odpovídá všemu v cestě URL, která následuje po segmentu cesty kódu jazyka (a lomítku). Toto se shoduje něco, ne nic. Žádost tedy nebude úspěšná /en/, pouze /en/. (Pokud to musí být úspěšné pro /en/ pouze také změňte tento dílčí vzor na (.*).) Toto je také zachycení a uložení v (druhém) $2 zpětná reference. např. Žádost /en/club/path a $2 drží club/path.
  • The QSA příznak připojí jakýkoli řetězec dotazu, který by mohl být přítomen při počátečním požadavku, a zpracovává "sloučení" s jakýmkoli řetězcem dotazu v souboru substituce tětiva. např. search=something. Mírný rozdíl oproti vašemu příkladu však je, že lang Parametr URL bude První, ne poslední - i když by to neměl být problém.

To, zda to funguje nebo ne, však stále závisí na tom, jak váš „rámec PHP“ směruje adresy URL. Například pokud je to jako WordPress a dívá se na $_SERVER['REQUEST_URI'] PHP superglobální, pak to bude stále vidět cestu URL před přepsat.

Pravděpodobně máte další přepisy, které následují?


RewriteRule \/(?[a-zA-Z]{2})\/club\/?(?.*)\?(?.*) /club/$1?search=$2&lang=$3 

ale to nebude považovat řetězce bez ?. Také nevím, jak vyřešit rozdíl dvěma případy ?lang= a &lang=. Nenašel jsem nic online.

Existuje zde řada problémů:

  • Regulární výraz není ukotven na začátku cesty URL, takže se shoduje //en/etc.
  • Jak je uvedeno výše, cesta URL se shodovala s RewriteRule vzor nezačíná lomítkem.
  • "bez toho to nebude uvažovat o řetězcích ?"- adresa URL shodná s RewriteRule vzor je pouze cesta URL. To nezahrnuje řetězec dotazu. Pokus o shodu řetězce dotazu zde tedy jednoduše selže. (Pokud jste potřebovali odpovídat řetězci dotazu, potřebujete další RewriteCond směrnice a zápas proti QUERY_STRING proměnná serveru.)
  • Nejedná se o chybu, ale není třeba zpětně lomítkem lomítka v regexu, protože lomítko zde nemá žádný zvláštní význam (mezery jsou oddělovače regulárního výrazu / argumentu v konfiguračních souborech Apache). Jak již bylo uvedeno, nejde o striktně chybu, stejně jako u většiny znaků můžete uniknout zpětným lomítkem, ale regex to komplikuje a ztěžuje čtení.
  • Používáte pojmenované zachycené skupiny (podporované v Apache 2.4.8+), ale používáte číselné zpětné odkazy v substituce tětiva. Nemůžete použít obojí. (Je snazší zůstat s numerickými zpětnými odkazy IMO.)
  • Zpětné odkazy v substituce řetězec se zdá být ve špatném pořadí. $1 je kód jazyka. např. mělo by to být více podobné /club/$2?search=$3&lang=$1 (i když to stále není správné).
  • "jak vyřešit rozdíl se dvěma případy ?lang= a &lang="- QSA Příznak (Query String Append) to udělá za vás. Kromě toho, že řetězec dotazu je připojeno, ne předpona.
  • 1 To je tak perfektní, moc vám děkuji za trpělivost a vysvětlení :)

Pracoval pro vás: Charles Robertson | Chcete nás kontaktovat?