Autor Zpráva
xxxadam577
Profil
Dobrý večer,
snažím se přepsat url do parametru takto:
RewriteEngine on
RewriteCond %{SCRIPT_FILENAME} !-d
RewriteCond %{SCRIPT_FILENAME} !-f
RewriteRule ^admin/(.*)$ admin.php?q=$1 [NC,QSA,L]
RewriteRule ^(.*)$ site.php?q=$1 [NC,QSA]

Problém je, že když je první adresář admin, tak se to ti tak směřujedo site.php namísto admin.php.

příklad:
localhost/anum/admin/cs/test -> admin.php
localhost/anum/query/string -> site.php

Předemděkuji za nápady.
Aaron
Profil *
ahoj. pokud to ma být podle příkladu nemelo by to být:

RewriteRule ^anum/admin/(.*)$ admin.php?q=$1 [NC,QSA,L]
xxxadam577
Profil
v adresáři anum je .htaccess, je to kořenový adresář projektu
RastyAmateur
Profil
Nejsem tedy na htaccess žádný specialista, takže ti nedokážu moc vysvětlit nějaký způsob řešení, ale já si v těchto situacích počínám způsobem pokus-omyl, funkcí var_dump() a když to začne fungovat podezřele podle mých představ, začnu teprve zkoumat, co se to děje.

V první řadě si myslím, že všechny RewriteCond se vztahují pouze na následující RewriteRule. Co jsem si tak zkoušel, tak by to i sedělo.

No, a to je vlastně všechno, co jsem udělal, aby mi to pomohlo :D

RewriteEngine on

RewriteCond %{SCRIPT_FILENAME} !-d
RewriteCond %{SCRIPT_FILENAME} !-f
RewriteRule ^admin/(.*)$ admin.php?q=$1 [NC,QSA,L]

RewriteCond %{SCRIPT_FILENAME} !-d
RewriteCond %{SCRIPT_FILENAME} !-f
RewriteRule ^(.*)$ site.php?q=$1 [NC,QSA]

Každopádně mě stejně zajímalo, proč to předtím nefungovalo a hlavně proč nezafungoval flag [NC,QSA,L]. Čekal jsem, že když to na to narazí (jakože je to tam daný příkaz první), tak se to zastaví a nazdar. Když jsem to nechal tak, jak to máš ty, jen si přejmenoval proměnné:

RewriteEngine on
RewriteCond %{SCRIPT_FILENAME} !-d
RewriteCond %{SCRIPT_FILENAME} !-f
RewriteRule ^admin/(.*)$ admin.php?q_admin=$1 [NC,QSA,L]
RewriteRule ^(.*)$ site.php?q_site=$1 [NC,QSA]

dostal jsem pak v jednoduchém souboru s výpisem (<?php var_dump(__file__); var_dump($_GET);) zajímavý výsledek:
/var/www/***/site.php:3:string '/var/www/***/site.php' (length=37)
/var/www/***/site.php:4:
array (size=2)
  'q_site' => string 'admin.php' (length=9)
  'q_admin' => string 'foo/bar/' (length=8)

Takže bych hádal, že z /admin/foo/bar/ se stalo admin.php?q_admin=foo/bar/, z čehož se pak stalo site.php?q_site=admin.php&q_admin=foo/bar/, což by sedělo s mojí původní myšlenkou, že RewriteCond se vztahuje pouze na první RewriteRule.

Jediné, co mi samotnému vrtá hlavou a těším se, až na to někdo odpoví je, proč nefungoval ten flag [NC,QSA,L]
Teď si tak říkám, že on ten flag dost možná funguje. Ono se to opravdu vykoná a dál se nejede, jenže ono to překlopí tu adresu /admin/foo/bar/ na novou, konkrétně na admin.php?q_admin=foo/bar/ a to opět projede přes htaccess, přičemž to matchne ten druhý regulár...
xxxadam577
Profil
Děkuji moc za řešení. Ten flag mi taky vrtá hlavou, protože by měl teoreticky zafungovat jako první :)
RastyAmateur
Profil
xxxadam577:
První výsledek od googlu na "htaccess flag L usage" mířil na stackoverflow (jak jinak), první odpověď, poslední odstavec. Takže jsem nakonec měl pravděpodobně pravdu s tím, že se to tam prostě dostane znovu, jen s jinou adresou.
Aaron
Profil *
abys ty cond nemusel opisovat: httpd.apache.org/docs/current/rewrite/flags.html#flag_s
RastyAmateur
Profil
Aaron:
Jak to myslíš? Jakože takto?
RewriteCond "%{REQUEST_FILENAME}" "!-f"
RewriteCond "%{REQUEST_FILENAME}" "!-d"
RewriteRule ".?" "-" [S=2]

RewriteRule ^(.*)$ site.php?q=$1 [NC,QSA]

RewriteRule ".?" "-" [S=1]

RewriteRule ^admin/(.*)$ admin.php?q=$1 [NC,QSA]

Vaše odpověď


Prosím používejte diakritiku a interpunkci.

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

0