Autor Zpráva
xlifer
Profil
Prošel jsem snad všechny vlákna, které se věnují poměrně často přesměrování složky na subdoménu, ale žadné řešení mi nepomohlo k vyřešení problému, proto zakládám samostatné vlákno a budu vděčný za pomoc.

Mám níže uvedený .htaccess na rootu FTP. K doméně jsou zřízené subdomény s1, s2, s3,
které jsou dostupné přímo z rootu FTP domény, nepřistupuje se k nim tedy samostatně z FTP.

Problém mám při zadání adresáře, kdy se má přesměrovat na subdoménu, poprvé se obsah subdomény načte, ale jakýkoliv další přístup v rámci subdomény již hází 500 interní chyba serveru. Zkouším kde co, ale vůbec nevím co s tím. Poradíte prosím?

1. Když zadám www.exapmle.com/s1
2. Proběhně v pořádku přesměrování na http://s1.exapmle.com/
3. Obsah s1.example.com se poprvé načte správě
4. Následně už pouze 500 chyba serveru


RewriteEngine On
RewriteBase /

# presmerování adresare na subdomenu
Redirect  301  /s1  http://s1.example.com
Redirect  301  /s2  http://s2.example.com
Redirect  301  /s3  http://s3.example.com

# index na doménu
RewriteCond %{ENV:REDIRECT_STATUS} =""
RewriteRule ^index.php http://www.example.com/ [R=301,L,QSA]

# vyjímka vnitrtního presmerování
RewriteCond %{REQUEST_FILENAME} soubor1\.php [NC,OR]
RewriteCond %{REQUEST_FILENAME} soubor2\.php [NC,OR]
RewriteCond %{REQUEST_FILENAME} soubor3\.php [NC]
RewriteRule .* - [L]

# presmerování na skript vnitriniho smerování - slozitejsi pravidla
RewriteCond %{QUERY_STRING} ^(.*)[\?|\&]a= [NC,OR]
RewriteCond %{QUERY_STRING} ^a= [NC,OR]
RewriteCond %{QUERY_STRING} ^(.*)[\?|\&]b= [NC,OR]
RewriteCond %{QUERY_STRING} ^b= [NC,OR]
RewriteRule /* presmeruj.php [L,QSA]

# presmerování zadané adresy bez www na verzi s www  
RewriteCond %{HTTP_HOST} ^example\.com$ [NC]
RewriteRule ^(.*)$ http://www.example.com/$1 [R=301,L]

# soubory, adresáre neprepisovat
RewriteCond %{REQUEST_FILENAME} -f [NC,OR]
RewriteCond %{REQUEST_FILENAME} -d [NC]
RewriteRule ^(.+) - [PT,L]
 
# lomítko na konec URL, pokud není
RewriteCond %{REQUEST_URI} !^(.*)/$
RewriteRule ^(.*)$ http://www.example.com/$1/ [R=301,L]

# predani parseru do skriptu
RewriteRule ^(.*)$ index.php?stranka=$1 [L,QSA]
Davex
Profil
Do zjišťování existence souboru nepatří příznak [NC]. Pak bude pravděpodobně ještě problém v některých dalších pravidlech, protože se budou provádět i na subdoménách, ale nechci předbíhat.
xlifer
Profil
Davex:

To jsem nevědel, takže když odstraním všechny [NC] z RewriteCond, tak největší problém bude asi odhladit, která ta pravidla se provádějí i na subdoménách, což bude asi jádro problému. Poradíte které by to mohly být? Díky.
Davex
Profil
xlifer:
takže když odstraním všechny [NC] z RewriteCond
Ne všechny [NC], ale jen v ověřování existence souborů. Tento příznak mění jen vyhodnocování regulárních výrazů.

RewriteCond %{REQUEST_FILENAME} -f [NC,OR]
RewriteCond %{REQUEST_FILENAME} -d [NC]

největší problém bude asi odhladit, která ta pravidla se provádějí i na subdoménách, což bude asi jádro problému. Poradíte které by to mohly být?
Možná nebudou, záleží na použitém způsobu tvorby subdomén. Pokud problémy nastanou, tak se budou provádět všechna pravidla, která nemají žádné podmínky podle obsahu %{HTTP_HOST}.

Může pomoci přidání tohoto pravidla někam před ostatní.

RewriteRule ^s[123]/ - [L]
xlifer
Profil
Davex:

Díky za tip, vyzkouším a dám vědět zda se tím vyřešilo neaplikování pravidel na subdomény.

Mám doporučené pravidlo spíše umístit už nad přesměrování subdomén nebo až pod ně?
Davex
Profil
xlifer:
Přesměrování Redirect s pravidly mod_rewrite přímo nesouvisí, takže by mělo být jedno.
xlifer
Profil
Davex:

Tak tohle pomohlo:

RewriteRule ^s[123]/ - [L]


Díky moc!

Vaše odpověď


Prosím používejte diakritiku a interpunkci.

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