Apache a nastavení mod rewrite v .htaccess – Webové servery (Apache, IIS...), .htaccess – Fórum – Programujte.com
 x   TIP: Přetáhni ikonu na hlavní panel pro připnutí webu

Apache a nastavení mod rewrite v .htaccess – Webové servery (Apache, IIS...), .htaccess – Fórum – Programujte.comApache a nastavení mod rewrite v .htaccess – Webové servery (Apache, IIS...), .htaccess – Fórum – Programujte.com

 

Toto vlákno bylo označeno za vyřešené.
oxidián0
Grafoman
30. 11. 2022   #1
-
0
-

Dělám si novou webovou stránku, která má mít hlavní soubor index.php . Po přistání na stránce uživatel zřejmě přečte něco jako úvodní krátké info a pak dostane asi čtyři odkazy na stránku. Články, respektive formuláře mají být umístěny ve složce pages kde budou soubory php s těma formulářema. Toto umístění do složky volím protože v kořenu už mám nějaké php soubory s konfigurací a index.php a txt soubory a nechci, aby se to pletlo. Jenže bych chtěl, aby uživatel viděl ne url https:/moje.infinity.com/pages/foo.php , https:/moje.infinity.com/pages/bar.php,  https:/moje.infinity.com/pages/pes.php

ale

https:/moje.infinity.com/foo , https:/moje.infinity.com/bar,  https:/moje.infinity.com/pes

jak tedy napsat pravidla pro .htaccess, aby se nemixnulo to co je v kořenu s tím co je v pages? Jistě jde i o to, že se ve stránkách pod pages/ načtou i odkazy na soubory js a css a bylo by lepší kdyby to vidělo od kořene js a css než odkazovat přes ../js a ../css ne?

Z toho co jsem hledal v manuálu mě napadlo jen toto:

RewriteEngine On
RewriteBase /

RewriteRule "^(foo|bar|pes)" "/pages/$1.php" [QSA]

Ale nenašel jsem tam infromace jak například použí RewriteBase a RewriteCond takže toto jsem jen tipl a nevím jestli argument na konci nemá být QSA,L.

Nahlásit jako SPAM
IP: 89.177.84.–
gna
~ Anonymní uživatel
1891 příspěvků
1. 12. 2022   #2
-
0
-

Jestli správně chápu, o co ti jde, tak to bude fungovat, tak jak chceš.

Ten přepis proběhne jen na serveru. Z pohledu prohlížeče, když budeš mít "/foo" a v něm "něco.css", tak to bude "/něco.css".

To [L] znamená last / konec zpracování. Jestli nechceš dělat nic dalšího, tak to tam můžeš přidat.

A asi bych do toho regexu na konec přidal $, pokud chceš matchovat jen "bar" a ne třeba i "barman".

Nahlásit jako SPAM
IP: 213.211.51.–
oxidián0
Grafoman
1. 12. 2022   #3
-
0
-

#2 gna
Chystám se to otestovat hned jak dopíšu svých několik článků na stránky. Ale ještě bych tam měl mít kód k js, css a obrázkům. Ale to bude asi na stejném principu.

Do regexu nechci dát $ protože tam přijdou argumenty. Uživatel najede na stránku s článkem a tlačítkem. /foo přečte si, klikne na Vložit data nebo tak něco... Pak musí vyplnit captchu. Takže tam musí být argument něco jako /foo/captcha ... pak tam bude něco jako /foo/identification ... a nakonec /foo/report ... mělo by to být několika stupnove zpracování dat, ale bude to v podstatě dělat jeden soubor php.

Nahlásit jako SPAM
IP: 94.113.175.–
oxidián0
Grafoman
2. 12. 2022   #4
-
0
-

#2 gna
Tak mi to nefunguje:

RewriteBase /

RewriteRule "^(?!index).+" "/pages/$0" [QSA]

url:

http://localhost/mojestranka/foo

Not Found

The requested URL /pages/foo was not found on this server.

Celé je to v adresáři mojestranka, pod tím je hlavní soubor index.php a složka pages

Jak to musím opravit, aby to vidělo ten hlavní adresář stránky? Dejmetomu že až to nahraju na freehosting bude se to jmenovat třeba mojestranka.infinity.net a otevřít budu chtít stránku mojestranka.infinity.net/foo ...

Je problém v tom, že nepočítám s tím, že se to celé nachází v té složce mojestranka? Tam by to asi chtělo dosadit nějakou proměnnou, ne?

Nahlásit jako SPAM
IP: 78.102.61.–
gna
~ Anonymní uživatel
1891 příspěvků
2. 12. 2022   #5
-
0
-

Jj, na tom localhostu potřebuješ zachovat to počáteční /mojestranka. Mělo by stačit upravit RewriteBase.

# dev
RewriteBase /mojestranka
# prod
RewriteBase /
Nahlásit jako SPAM
IP: 213.211.51.–
oxidián0
Grafoman
2. 12. 2022   #6
-
0
-

#5 gna
Stále dostávám tu stejnou hlášku. Ty komentáře dev - prod znamenají co? Zkoušel jsem to i s RewriteBase /localhost/mojestranka

Nahlásit jako SPAM
IP: 78.102.61.–
gna
~ Anonymní uživatel
1891 příspěvků
2. 12. 2022   #7
-
0
-

dev a prod jako "development" a "production" server.

Přidej tam [R] ať vidíš kam to přesměrovává.

Nahlásit jako SPAM
IP: 213.211.51.–
oxidián0
Grafoman
2. 12. 2022   #8
-
0
-

 Mám toto (přidal jsem .php na konec a zkouším i ty argumenty... localhost/moje-stranka/foo?a=1

změní to na: http://localhost/pages/foo.php?a=1

to je divné, že to vypustilo moje/stránka/. Asi je špatně ten regulární výraz. Nevím...

RewriteBase /moje-stranka
RewriteRule "^(?!/index).+" "/pages/$0.php" [QSA,R]
Nahlásit jako SPAM
IP: 78.102.61.–
gna
~ Anonymní uživatel
1891 příspěvků
2. 12. 2022   #9
-
0
-

Nevím, možná pages bez toho počátečního lomítka, ale myslím si, že by se RewriteBase mělo vždycky předřadit. V dokumentaci taky nic nevidím a instalovat se mi to nechce :-)

Nebo možná prostě napiš do RewriteRule tu cestu celou.

Nahlásit jako SPAM
IP: 213.211.51.–
oxidián0
Grafoman
2. 12. 2022   #10
-
0
-

Co mě napadlo zkusit:

RewriteCond "(?!/index)$"
RewriteRule "(adresar-moje-stranka)/.+" "-" [E=dirname:$0]
RewriteRule "^/%{ENV:dirname}/([^/?]+)" "/%{ENV:dirname}/pages/$0.php" [QSA,L]


RewriteCond má zjednodušit RewriteRule a zajistit, že nejde o situaci, kdy je tam index.php. Adresář ve kterém je stránka umístěná je pojmenován jako proměnná dirname, vrací to první výskyt z prvních závorek. Pak to má za názvem serveru hledat název toho adresáře až po lomítko nebo otazník. Přejmenovat se to má na název adresáře/pages/

Nefunguje. Asi není splněna některá z podmínek regexu. Píše že nemůže najít url název serveru/foo . čili neprovádí to přejmenování.

Příklad použití Env jsem našel zde.

Nahlásit jako SPAM
IP: 78.102.61.–
gna
~ Anonymní uživatel
1891 příspěvků
2. 12. 2022   #11
-
0
-

Já jsem to zkusil bez toho lomítka a funguje to. Dává to smysl, nevím proč jsem měl zafixováno, že se RewriteBase přidává vždycky.

Nahlásit jako SPAM
IP: 213.211.51.–
oxidián0
Grafoman
2. 12. 2022   #12
-
0
-

Už jsme vyzkoušeli všechno možný... Níže uvedené věci jsem zkoušel v různých kombinacích (Apache 2.4.4) včetně toho že jsem zrušil rewritebase nebo jsem měl rewritebase i s názvem adresáře složky.ve kterém je celá stránka umístěná. Pozn. přejmenoval jsem složky a soubor, takže teď je to localhost/adresarstranky/index.php a localhost/adresarstranky/clanky/clanek.php

 Zkoušel jsem taky rewritecond (?!index\.php)$ nebo rewritecond (?!index\.php|\.php)$ protože s \.php na konci se nemá navenek vůbec operovat. A mám pocit že ten odkaz na obsah závorek má být $1 a ne $0 protože $0 je myslím celý nalezený řetězec

RewriteEngine On
#RewriteBase /

RewriteCond "clanek"
RewriteCond %{ENV:REDIRECT_STATUS} =""
RewriteCond %{REQUEST_FILENAME} -f
# RewriteRule "([^\.?/]+)" "/clanky/$1.php" [QSA,L]
RewriteRule "(.+)[^/]" "/clanky/$0.php" [QSA,L]

Např. toto

RewriteEngine On
RewriteCond "clanek"
RewriteRule "([^\.?/]+)" "/clanky/$1.php" [QSA,L]

The requested URL /clanky/clanek.php was not found on this server.

Přitom to tam je. Takže by to měl najít.

Nahlásit jako SPAM
IP: 78.102.61.–
gna
~ Anonymní uživatel
1891 příspěvků
2. 12. 2022   #13
-
0
-

#12 oxidián
Přitom to tam je. Takže by to měl najít.

Něco tam je, když ti to projde přes cond -f. Ale asi tam není /clanky/ když je to /adresarstranky/clanky/

Nahlásit jako SPAM
IP: 213.211.51.–
oxidián0
Grafoman
2. 12. 2022   #14
-
0
-

#13 gna
Ne, ta podmínka neprojde. Soubor clanky neexistuje nikde.

RewriteCond %{REQUEST_FILENAME} -f

Taky neprojde:

RewriteCond /clanky/clanek -f

Neprojde:

RewriteCond /clanky/clanek.php -f


Nerojde (-F Is existing file, via subrequest.
Checks whether or not TestString is a valid file,)
:

RewriteCond /clanky/clanek.php -F

Ale toto projde:

RewriteCond clanky/clanek.php -F

Bingo!

RewriteCond clanky/clanek.php -F
RewriteRule "([^\.?/]+)" "clanky/$1.php" [QSA,L]

A měl jsi pravdu to RewriteBase / se musí dát pryč.

A jede!

Dík za pomoc

Nahlásit jako SPAM
IP: 78.102.61.–
gna
~ Anonymní uživatel
1891 příspěvků
2. 12. 2022   #15
-
0
-

Aha, to jsem špatně pochopil ten první konfig.

Ale prostě to přepisuje na /clanky/, tak tam buď dej celou cestu, nebo umaž to lomítko a "předponu" dej do rewritebase.

Nahlásit jako SPAM
IP: 213.211.51.–
gna
~ Anonymní uživatel
1891 příspěvků
2. 12. 2022   #16
-
+1
-
Zajímavé

Nepostřehl jsem ten edit, že už ti to chodí. Asi se ti to stejně chová jinak než mně, ale hlavně, že to šlape :-)

Nahlásit jako SPAM
IP: 213.211.51.–
oxidián0
Grafoman
3. 12. 2022   #17
-
0
-

Toto taky funguje:

echo "SCRIPT_NAME:<br>\n".$_SERVER['SCRIPT_NAME']."<br>\nGET:<br>\n";
print_R($_GET);
RewriteEngine On

RewriteCond "^(?!/index).+"
RewriteCond clanky/clanek.php -F
RewriteRule "([^\.?/]+)" "clanky/$1.php" [QSA,E=page:$1]
RewriteCond clanky/%{page}.php -F
RewriteRule "(.+)[^/]" "/%{page}/$1.php" [QSA,L]


Jenom poznámka: zatím jsem nepřišel na to jak se zbavit toho statického článku, který už nepotřebuju. Poslední dva řádky zakomentovat lze, toto ale zakomentovat nelze:

RewriteCond clanky/clanek.php -F


Jak přeskočit tento řádek, aby hledal skutečně to co jsem momentálně zadal jako dalsi-clanek => clanky/dalsi-clanek.php ?

Nahlásit jako SPAM
IP: 78.102.61.–
gna
~ Anonymní uživatel
1891 příspěvků
3. 12. 2022   #18
-
0
-

Mně není jasné, jak to má fungovat. Možná to spíš rozepiš jako adresy.

index... => index...
foo => clanky/foo.php
??? => ???

Nebo všechno směruj na jeden skript, kde si to url rozparsuješ a naincluduješ soubory jak chceš. Ať už rewritem nebo jako ErrorDocument.

Nahlásit jako SPAM
IP: 213.211.51.–
oxidián0
Grafoman
3. 12. 2022   #19
-
0
-

Dobrá popíšu tedy co to dělá. Nepopíšu jak to funguje protože sám se učím metodou "pokus omyl".

Mám různé články soubory .php v adresáři /clanky nebo stránka ke kterým přistupuju níže uvedenými způsoby

http://localhost/moje-stranka/podzim

http://localhost/moje-stranka/mikulas

http://localhost/moje-stranka/mikulas

http://localhost/moje-stranka/vanoce

http://localhost/moje-stranka/novy-rok

http://localhost/moje-stranka/uvod

http://localhost/moje-stranka/registrace

http://localhost/moje-stranka/formular

http://localhost/moje-stranka/formular?a=1

http://localhost/moje-stranka/formular?a=2

http://localhost/moje-stranka/clanek

atd. atd.

Co to dělá je na první pohled to co chci aby to dělalo. Po zadání výše uvedených url se změní požadavek na

http://localhost/moje-stranka/pages/podzim.php

http://localhost/moje-stranka/pages/mikulas.php

http://localhost/moje-stranka/pages/mikulas.php

http://localhost/moje-stranka/pages/vanoce.php

http://localhost/moje-stranka/pages/novy-rok.php

http://localhost/moje-stranka/pages/uvod.php

http://localhost/moje-stranka/pages/registrace.php

http://localhost/moje-stranka/pages/formular.php

http://localhost/moje-stranka/pages/formular.php?a=1

http://localhost/moje-stranka/pages/formular.php?a=2

http://localhost/moje-stranka/clanek.php

Poslední volání vypíše:

SCRIPT_NAME:
http://localhost/…a/clanek.php
GET:
Array ( [a] => 1 ) 

Wait a moment... clanek.php byl jen pokusný soubor a chci ho smazat. Když ho smažu. Co se stane?

Mohu zkoušet volat jakoukoliv z uvedených stránek:

http://localhost/moje-stranka/podzim

http://localhost/moje-stranka/mikulas

http://localhost/moje-stranka/mikulas

http://localhost/moje-stranka/vanoce

http://localhost/moje-stranka/novy-rok

http://localhost/moje-stranka/uvod

http://localhost/moje-stranka/registrace

http://localhost/moje-stranka/formular

http://localhost/moje-stranka/formular?a=1

http://localhost/moje-stranka/formular?a=2

http://localhost/moje-stranka/clanek

Dejmetomu /formular

a výstup bude:

Not Found

The requested URL /moje-stranka/formular was not found on this server.

Protože jsem smazal (či přejmenoval) clanek.php

Takže nyní hledám způsob, jak to napsat lépe, aby to fungovalo i bez té přebytečné řádky

RewriteCond clanky/clanek.php -F


která tam teď z nějakého záhadného důvodu musí být, ačkoliv ve skutečnosti nepotřebuji testovat jestli tam ten soubor clanek.php je nebo není... Ať už to směruju na /clanek nebo /formular či jakýkoliv jiný. Těch stránek respektive článků mám teď asi sedm, ale co když přibude dalších. Jasně, mohl bych ho tam nechat a pokaždé dělat tu kontrolu, ale technicky to není správný postup. Je to jako kdyby si chtěl spustit průzkumník ve Windowsu nebo aplikaci Firefox a potřeboval by si při tom otestovat jestli existuje soubor z LibreOfficu nainstalovaný na disku C: ... když navíc programy mám uložené na jiném oddílu :)

Nahlásit jako SPAM
IP: 78.102.61.–
oxidián0
Grafoman
3. 12. 2022   #20
-
0
-

Šlo to zredukovat. Ale nechápu proč je tam třeba ten test...

RewriteCond clanky/clanek.php -F
RewriteRule "([^\.?/]+)" "clanky/$1.php" [QSA,E=page:$1]
Nahlásit jako SPAM
IP: 78.102.61.–
peter
~ Anonymní uživatel
4014 příspěvků
3. 12. 2022   #21
-
0
-

Testujes, zda adresa obsahuje a pokud ano, tak pomoci reg. vyrazu (ten mas zvoleny, 'vyber vse za otaznikem') (nebo jinak) to prepises na jinou.Spis mne zarazi, ze to presmerovavas na php soubory. Kdyz uz to takto presmerovavas, tak bych to posilal primo na html soubory (bez php se stranak zobrazi rychleji) nebo to nepresmerovaval vubec. Ale, nejspis mas k tomu sve duvody.
 

Nahlásit jako SPAM
IP: 193.84.197.–
oxidián0
Grafoman
3. 12. 2022   #22
-
0
-

#21 peter
Stránky jsou php, protože obsahují php kód. Například zítra chci dodělat dynamické hlavičky a pak tam ještě přidám nakešovaný html (možná to nakonec bude full html a udělám to jak říkáš, zatím je to dynamicky). Po odstranění přebytečného kódu:

RewriteCond clanky/clanek.php -F
RewriteRule "([^\.?/]+)" "clanky/$1.php" [QSA,L]
Nahlásit jako SPAM
IP: 78.102.61.–
gna
~ Anonymní uživatel
1891 příspěvků
3. 12. 2022   #23
-
0
-

Pořád nevím, jestli tomu rozumím správně :-)

RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule "^(.*)$" "clanky/$1.php" [QSA,L]
Nahlásit jako SPAM
IP: 213.211.51.–
oxidián0
Grafoman
4. 12. 2022   #24
-
0
-

Wow, věděli jste, že ten rewritecond se testuje až po rewritecond? Já myslel že je to naopak.  https://httpd.apache.org/docs/current/rewrite/tech.html#InternalRuleset

#23 gna
Wow, takže ten zázrak, aby to fungovalo bez rewritecond je v tom, že tam navíc musí být ten caret.

RewriteRule "^([^\.?/]+)$" "clanky/$1.php" [L]

No a .* tam být nemůže protože by se to skrytě zacyklylo (chyba: internal server error). Proto jsem vyloučil ty lomítka.

Nahlásit jako SPAM
IP: 78.102.61.–
oxidián0
Grafoman
8. 12. 2022   #25
-
0
-

Nakonec bych ještě potřeboval přijít na to jak udělat vyjímku pro index a stránku samotnou. Když zadám

http://mojestranka.cz nebo http://mojestranka.hosting.cz nebo http://mojestranka.hosting.cz/index či http://mojestranka.hosting.cz/index.php, tak index se má načíst z adresaře moje-stranka, ostatni php soubory jsou  v pages. jen index.php je vyjímka.

Zkoušel jsem RewriteCond

RewriteCond ".*(?!(index|index.php))$"
RewriteRule "^([^\.?/]+)$" "clanky/$1.php" [L]

toto zrovna nefunguje (localhost/moje-stranka/index)

Edit:

Asi jsem to zvládl. Zdá se že teď to jede jak má:

RewriteCond %{REQUEST_URI} "!index$" 
RewriteRule "^([^\.?/]+)$" "clanky/$1.php" [L]

RewriteRule "index$" "index.php" [L]
Nahlásit jako SPAM
IP: 94.113.183.–
Zjistit počet nových příspěvků

Přidej příspěvek

Toto téma je starší jak čtvrt roku – přidej svůj příspěvek jen tehdy, máš-li k tématu opravdu co říct!

Ano, opravdu chci reagovat → zobrazí formulář pro přidání příspěvku

×Vložení zdrojáku

×Vložení obrázku

Vložit URL obrázku Vybrat obrázek na disku
Vlož URL adresu obrázku:
Klikni a vyber obrázek z počítače:

×Vložení videa

Aktuálně jsou podporována videa ze serverů YouTube, Vimeo a Dailymotion.
×
 
Podporujeme Gravatara.
Zadej URL adresu Avatara (40 x 40 px) nebo emailovou adresu pro použití Gravatara.
Email nikam neukládáme, po získání Gravatara je zahozen.
-
Pravidla pro psaní příspěvků, používej diakritiku. ENTER pro nový odstavec, SHIFT + ENTER pro nový řádek.
Sledovat nové příspěvky (pouze pro přihlášené)
Sleduj vlákno a v případě přidání nového příspěvku o tom budeš vědět mezi prvními.
Reaguješ na příspěvek:

Uživatelé prohlížející si toto vlákno

Uživatelé on-line: 0 registrovaných, 3 hosté

 

Hostujeme u Českého hostingu       ISSN 1801-1586       ⇡ Nahoru Webtea.cz logo © 20032024 Programujte.com
Zasadilo a pěstuje Webtea.cz, šéfredaktor Lukáš Churý