Autor Zpráva
simka00
Profil
RewriteEngine On

RewriteRule ^neco/(.*) /skript.php?x=$1


toto podstrčí "neco/123" souboru "skript.php?x=123".
jenže jak udělám, aby funguvalo i "neco/123?par=456" => "skript.php?x=123&par=456"?



PS: myslím si, že by nebylo ke škodě založit samostatné téma mod_rewrite
halogan
Profil
RewriteRule ^neco/([0-9]+)(:?\?par=([0-9]+))? /index.php?x=$1&par=$2 [L,QSA]


Funguje v poradku, otestovano.
koudi
Profil
nejsem si jistej, ale zkus tam dát [QSA]
Medhius
Profil
Nešlo by to takhle?

RewriteRule ^neco/(.*)(\?*)(.*) /skript.php?x=$1&$2
halogan
Profil
Medhius: Nezapominejte, ze * je libovolne opakovani, tedy i nulove, takze je lepsi pouzivat +.
halogan
Profil
Medhius: A ten vas priklad by nesel, protoze 1) mate 3 zavorky, ale predavate jen dve promenne (cili ztracena data) 2) ? mate soucasti zavorky, takze se bude pamatovat a bude tam nadbytecny
Medhius
Profil
halogan: Máte pravdu, měl jsem tam pár chyb. Udělal bych to spíš takto:


RewriteRule ^neco/([^?]*)(\?*)(.*) /skript.php?x=$1&$3


Pokud nebude druhý parametr uveden, zůstane na konci &, ale to ničemu nevadí.
simka00
Profil
halogan
děkuji, funguje pro čísla. jenže jak to udělat, když proměnná par bude vždy číslo, ale v proměnné x se budou vyskytovat i písmena a pomlčky, možná i jiné znaky.
Medhius
Profil
simka00: Zkuste to co jsem psal já. Zatím co jsem zkoušel, tak to funguje.
halogan
Profil
RewriteRule ^neco/(.+)(:?\?par=([0-9]+))? /index.php?x=$1&par=$2 [L,QSA]
halogan
Profil
Medhius: Jak mam porozumnet tomuto:
(\?*)

Libovolny pocet otazniku?
Medhius
Profil
Ano, v našem případě Buď jeden nebo žádný. Když tam nebude žádný první závorka pohltí celý řetězec (to je ten první případ).
simka00
Profil
halogan
na to už jsem taky přišel, ale to mi napíše adresu index.php?x=spam&x=&par=123 - jde to ještě nějak upravit?
Medhius
Profil
Zkoušel jsem pomocí

echo preg_replace("~^neco/([^?]*)(\?*)(.*)~","/skript.php?x=\\1&\\3",'neco/ 32-6?par=46');

a to vyhodí

/skript.php?x=32-6&par=46

Pravda je, že v htaccessu jsem to přímo nezkoušel. Možná to dělá něco jiného.
halogan
Profil
Medhius: Tak od toho je ale ?, nikoliv *.
Medhius
Profil
Ano, máte pravdu. Obojí však funguje.
halogan
Profil
Medhius: Je to sice otazka milisekund, ale pri vetsi zatezi to muze byt znat. Nechapu duvod, proc pouzivat *, kdyz se k tomu pouziva otaznik. Pak kdyz nekdo zada /foo/123/??????bar=foo, tak to neni korektni.

RewriteRule ^neco/(.+)\??(.*) /index.php?x=$1$2 [L,QSA]
Medhius
Profil
Ano, máte úplnou pravdu. Ten Váš způsob je samozřejmě korektnější i efektivnější.
simka00
Profil
Medhius
halogan
kde jste se to naučili?
halogan
Profil
simka00: Regularni vyrazy z PCRE serialu na Interval.cz a mod_rewrite ani nevim, rekl bych ze apache.org a tady z fora, ale zakladem jsou regexpy.
Kajman_
Profil *
V rewriterule se nedá testovat query string, takže diskuse o rozdělení výrazu i s query stringem je bezpředmětná.

K původní otázce - stačí přidat uváděný příznak QSA (nejlépe i s L).
Toto téma je uzamčeno. Odpověď nelze zaslat.

0