Portál AbcLinuxu, 28. června 2025 00:44


Dotaz: apache2 mod_rewrite

26.7.2012 16:22 kei.101
apache2 mod_rewrite
Přečteno: 334×
Odpovědět | Admin
Dobrý den.

Už půl dne tu koumám jak správně použít mod_rewrite pro daný problém a nedaří se mi, tak bych rád poprosil o radu někoho zkušenějšího. Řeším toto:

Potřeboval bych do .htaccess vložit mod_rewrite pravidla tak, aby pro cestu ^([^/]+)(.*)$ platilo: 1] Pokud v daném adresáři existuje podadresář nebo soubor s názvem $1, tak se nestane nic.. soubor se běžně obslouží 2] ..jinak pokud v daném adresáři existuje soubor $1.wsgi, přepíše se cesta na $1.wsgi$2 3] ..jinak se cesta přepíše na index.wsgi$1$2

Pro názorný příklad, mám li adresářovou strukturu: / /index.wsgi /test.wsgi /pokus/ /pokus/index.wsgi

Pak se bude přepisovat takto: '/' -> index.wsgi /a/b/c -> index.wsgi/a/b/c /test -> test.wsgi /test/a/b/c -> test.wsgi/a/b/c /pokus/a/b/c -> /pokus/index.wsgi/a/b/c

Ten poslední krok je možné obsloužit rekurzivně, tj. v adresáři /pokus bude opět .htaccess

Díky za pomoc

JN
Nástroje: Začni sledovat (0) ?Zašle upozornění na váš email při vložení nového komentáře.

Odpovědi

27.7.2012 09:12 Filip Jirsák | skóre: 68 | blog: Fa & Bi
Rozbalit Rozbalit vše Re: apache2 mod_rewrite
Odpovědět | | Sbalit | Link | Blokovat | Admin
Takhle nějak?
RewriteCond $1 -d [OR]
RewriteCond $1 -f
RewriteRule ^([^/]+)(.*)$ - [L]

RewriteCond $1.wsgi -f
RewriteRule ^([^/]+)(.*)$ /$1.wsgi$2 [L]

RewriteRule ^([^/]+)(.*)$ /index.wsgi$1$2 [L] 
27.7.2012 13:14 kei.101
Rozbalit Rozbalit vše Re: apache2 mod_rewrite
Už jsem to vyřešil, ale koukám, že dost podobně až na několik věcí:
  • Nevěděl jsem o flagu [OR], takže to první pravidlo mám nadvakrát :)
  • Ten druhý a třetí odstavec bohužel nefunguje bez RewriteBase a cesty do adresáře, protože to používám v .htaccess v rámci UserDir...
Protože nelze použít proměnné úplně kdekoli v apache configu, napsal jsem si skript na generování požadovaného textu pro .htaccess libovolného adresáře:
#!/bin/sh

: ${USER:=$(whoami)}
: ${DOC_ROOT:=/home/$USER/http}
: ${DIR:=$(pwd)}
 
rel_dir=${DIR#$DOC_ROOT}
if [ "$rel_dir" == "$DIR" ]; then
    echo "Directory not in user document root!" >&2
    echo "DOC_ROOT: $DOC_ROOT" >&2
    echo "DIR: $DIR" >&2
    exit 1
fi
 
echo 'RewriteEngine On'
echo 'RewriteCond %{REQUEST_FILENAME} -f' [OR]
echo 'RewriteCond %{REQUEST_FILENAME} -d'
echo 'RewriteRule .* - [L]'
echo "RewriteCond $DIR/\$1 -f"
echo 'RewriteRule ^([^.]+\.wsgi).* - [L]'
echo
echo "RewriteBase /~$USER$rel_path/"
echo "RewriteCond $DIR/\$1.wsgi -f"
echo 'RewriteRule ^([^/]*)(.*)$ $1.wsgi$2 [L]'
echo 'RewriteRule ^(.*)$ index.wsgi/$1 [L]'

# EOF
27.7.2012 15:22 Filip Jirsák | skóre: 68 | blog: Fa & Bi
Rozbalit Rozbalit vše Re: apache2 mod_rewrite
V tom druhém a třetím případě by určitě bylo možné použít relativní cesty, já jsem použil vzor, který jste měl v dotazu.
27.7.2012 18:52 kei.101
Rozbalit Rozbalit vše Re: apache2 mod_rewrite
No mě právě ta relativní cesta nějak nefungovala :( Rád bych to udělal bez těch absolutních cest, kdybych věděl jak.. Vždycky se mi to přepsalo na cestu ve filesystému a pak mi to napsalo, že na serveru taková cesta neexistuje.. tak teď to přepisuju na cestu http requestu, tedy ~username/... místo /home/username/http/... Každopádně díky za odpověď a všechna čest to takhle z fleku dát dohromady :) Minimálně ten OR flag mi přišel vhod :)
27.7.2012 21:15 Filip Jirsák | skóre: 68 | blog: Fa & Bi
Rozbalit Rozbalit vše Re: apache2 mod_rewrite
mod_rewrite pracuje s cestou požadavku, tj. přepisovat to na /~username/ a ne /home/username/http/ je správně. Problém ale může být v tom, že ty cesty nevedou na dokumenty v DocumentRoot, na to je v Apache nějaké omezení.

Z fleku to rozhodně nebylo, inspiroval jsem se v dokumentaci mod_rewrite.
27.7.2012 18:55 kei.101
Rozbalit Rozbalit vše Re: apache2 mod_rewrite
Navíc jsem ještě během pokusů zjistil, že mi přijde vhod, že když někde v requestu (nejen na konci) je (.*)\.wsgi, tak ten pořadavek nepřepisovat.. a tak v tom pravidlu taky potřebuju znát nějakou cestu ve filesystému bohužel.. ale ten skript na generování teď funguje přesně, jak potřebuji a vygeneruje mi .htaccess pro libovolný adresář, aniž bych musel ručně dopisovat nějaké cesty, takže mi to stačí :)

Založit nové vláknoNahoru

Tiskni Sdílej: Linkuj Jaggni to Vybrali.sme.sk Google Del.icio.us Facebook

ISSN 1214-1267, (c) 1999-2007 Stickfish s.r.o.