Autor Zpráva
Onecar
Profil
Zdravím,

v souboru .htaccess mám následující pravidlo:

# source.php?web=name > /source/web/
RewriteRule ^source/([A-Za-z0-9-\_]+)/?$ source.php?web=$1 [L]


Odkaz vypada poté přesně takto: http://www.example.com/source/AnandTech.com . Podstrčení na soubor source.php funguje, opravdu se mi načte. Problém je v tom, že v proměnné $_GET['web'] nic nemám, resp. vůbec nedošlo k jejímu "nastavení". V souboru source.php je ihned na prvním řádku podmínka:

if (!isset ($_GET['name'])) die ("Promenna je prazdna.");


... která se vyhodnotí kladně a script skončí výpisem v die(). S podezřením na špatný regulár jsem zkusil i nejbenevolentnější variantu, jakou jsem schopen vymyslet:

# source.php?web=name > /source/web/
RewriteRule ^source/(.*)/?$ source.php?web=$1 [L]


Bez výsledku, v $_GET['web'] stále nic není. Zajímavé je, že jiné stránky mi s podobným zápisem fungují (pravda, nepředávám řetězec, ale pouze číslo, takže regulár je jiný), nechápu proč mi tento kód nechce fungovat.

Díky předem za pomoc.
G3n3sis19
Profil
chybí ti / na konci, to znamená
http://www.example.com/source/AnandTech.com/ protože se po ní ohlížíš v tom htaccessu (to / před ?$)

Ikdyž je divné, že ti to přepíše na source.php když tam to / nemáš.
Onecar
Profil
Nepomohlo :-(.

Regulár je takovýto:

# source.php?web=name > /source/web/
RewriteRule ^source/([A-Za-z0-9-\_]+)/?$ source.php?web=$1 [L]


URL takováto: http://www.example.com/source/AnandTech.com/ .

.htaccess mě správně poslal na source.php (ověřuju podmínkou), ale v $_GET['web'] nic není.
G3n3sis19
Profil
zkus toto
# source.php?web=name > /source/web/
RewriteRule ^source/([A-Za-z0-9-\_]+) source.php?web=$1 [L]
Onecar
Profil
Stále nic.
Onecar
Profil
Další zajímavost: regulár vypadá takto.

# source.php?web=name > /source/web/
RewriteRule ^source/([A-Za-z0-9-\_]+) blabla.php?web=$1 [L]


URL: http://www.example.com/source/AnandTech.com nebo http://www.example.com/source/AnandTech.com/ , na chování to očividně nemá vliv.

Soubor blabla.php neexistuje. Přesto po uložení .htaccess a ověření funkčnosti URL stále vidím "Promenna je prazdna.". Restart Apache nepomáhá. Očividně tedy stále jsem na souboru source.php. Netuší někdo, co se to děje?
G3n3sis19
Profil
to se mi taky stalo. Máš v apachi povolený multiviews nebo tak něco? Asi to na to nemá vliv, ale zkus to. Pokud ani to nepomůže, přejmenuj source.php na něco jiného.

Pokud ani to nepomůže, nemá na to vliv ještě jiný htaccess ?
Davex
Profil
Onecar:
Asi to bude tím, že nastavuješ jinou proměnnou než ověřuješ.

RewriteRule ^source/([A-Za-z0-9-\_]+)/?$ source.php?web=$1 [L]

if (!isset ($_GET['name'])) die ("Promenna je prazdna.");
Onecar
Profil
Nejdřív díky za to, že se mi snažíte pomoci :-).

Davex: To jsem odladil již před pár minutami, v tomhle chyba není. I po opravení se to stále chová takto divně.
G3n3sis19: V httpd.conf jsem objevil přesně tyto dva řádky, které klíčové slovo MultiViews obsahují:

Options Indexes FollowSymLinks MultiViews ExecCGI
Alias /icons/ "C:/AppServ/Apache2.2/icons/"

<Directory "C:/AppServ/Apache2.2/icons">
    Options Indexes MultiViews
    AllowOverride None
    Order allow,deny
    Allow from all
</Directory>


Přejmenování source.php na amadeus.php již funguje, vrací to 404. Žádný jiný .htaccess ve složce nepoužívám.
Upravil jsem .htaccess aby směřoval na amadeus.php a vypadá to, že konečně v proměnné $_GET['web'] něco mám. Bohužel ale přenášený AnandTech.com je v $_GET['web'] uložen pouze jako AnandTech, tj. bez koncovky. Asi za to může nedokonalý regulár, nějaký tip na jeho úpravu?
G3n3sis19
Profil
RewriteRule ^source/([A-Za-z0-9-\_\.]+)/?$ source.php?web=$1 [L]


zapoměl si tam tečku
Onecar
Profil
Blížíme se k jádru pudla. Tvůj regulár je již bezchybně funkční, i script funguje pokud v .htaccess mířím na amadeus.php.
Pokud však v .htaccess mířím na source.php a přejmenuju amadeus.php na source.php, script opět skončí chybou v die(). Proč se tomu děje?
G3n3sis19
Profil
a četl si Davexův příspěvek?
Onecar
Profil
Četl, opakuji že v tomhle chyba není, podmínka je již hezkých pár minut definována správně (všiml jsem si toho sám, původně jsem chtěl přenášet hodnotu jako "name", pak jsem ji změnil na "web" a podmínku zapomněl opravit). Nyní je to již tak, jak má být.

Myslím, že můžeme toto téma ukončit, pokud teda někdo neví, proč nefunguje varianta se směrováním na source.php. Já to vyřešil tak, že jsem source.php přejmenoval na echo-web.php a vše je funkční. Jen mi to stále vrtá hlavou...

Díky G3n3sis19 za pomoc, cením si toho (škoda, že tu není karma) ;-).
Davex
Profil
Onecar:
proč nefunguje varianta se směrováním na source.php
Protože neexistuje adresář ani soubor /source, tak zapnutý modul mod_negotiation (MultiViews) najde náhradu v podobě souboru source.php a převede adresu na /source.php/AnandTech.com/, která nevyhoví regulárnímu výrazu v pravidle. Cesta je platné volání skriptu a zbytek z ní se objeví v proměnné $_SERVER['PATH_INFO'].

Vaše odpověď


Prosím používejte diakritiku a interpunkci.

Ochrana proti spamu. Napište prosím číslo dvě-sta čtyřicet-sedm: