Autor | Zpráva | ||
---|---|---|---|
xxxadam577 Profil |
#1 · Zasláno: 31. 7. 2019, 18:26:50
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 * |
#2 · Zasláno: 31. 7. 2019, 18:48:03
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 |
#3 · Zasláno: 31. 7. 2019, 18:59:38
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 |
#5 · Zasláno: 31. 7. 2019, 19:33:01
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 * |
#7 · Zasláno: 31. 7. 2019, 20:04:42
abys ty cond nemusel opisovat: httpd.apache.org/docs/current/rewrite/flags.html#flag_s
|
||
RastyAmateur Profil |
#8 · Zasláno: 31. 7. 2019, 20:11:27
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] |
||
Časová prodleva: 5 let
|
0