mod_rewrite, если файл существует - PullRequest
4 голосов
/ 05 мая 2010

У меня уже есть два правила перезаписи, которые сейчас работают корректно, но для идеальной работы необходимо добавить еще немного кода.

У меня есть веб-сайт, размещенный на mydomain.com, и все subdom.mydomain.com переписываются на mydomain.com/subs/subdom. Моя CMS должна обработать запрос, если достигаемый файл не существует, перезапись выполняется следующим образом:

RewriteCond $1 !^subs/
RewriteCond %{HTTP_HOST} ^([^.]+)\.mydomain\.com$
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)$ subs/%1/index.php?page=$1 [L]

Моя CMS обрабатывает следующую часть синтаксического анализа, как обычно. Проблема в том, что если файл действительно существует, мне нужно ссылаться на него, не проходя через мою CMS, мне удалось сделать это так:

RewriteCond $1 !^subs/
RewriteCond %{HTTP_HOST} ^([^.]+)\.mydomain\.com$
RewriteCond %{REQUEST_FILENAME} -f [OR]
RewriteCond %{REQUEST_FILENAME} -d
RewriteRule ^(.*)$ subs/%1/$1 [L]

Пока что это похоже на шарм. Теперь я привередлив, и мне нужно иметь файлы по умолчанию, которые хранятся в подпрограммах / default /. Если файл существует в папке поддоменов, мы должны взять его, но если нет, нам нужно получить файл из поддоменов по умолчанию. И если файл нигде не существует, мы должны использовать страницу 404 из текущего субдомена, если ее нет.

Надеюсь, это достаточно хорошо описано. Спасибо за ваше время!

Ответы [ 2 ]

3 голосов
/ 06 мая 2010

Проблема в том, что вам нужно указать абсолютный путь к файловой системе, чтобы заставить -f и -d работать. Если вы находитесь в корне документа, вы можете использовать это правило:

RewriteCond $1 !^subs/
RewriteCond %{DOCUMENT_ROOT}/subs/default/$1 -f [OR]
RewriteCond %{DOCUMENT_ROOT}/subs/default/$1 -d
RewriteRule ^(.*)$ subs/default/$1 [L]

Но если вы где-то еще, будет трудно получить правильный префикс пути.

1 голос
/ 06 мая 2010

Благодаря Gumbo мне удалось выяснить, как это исправить. Вот что я придумал:

#GET FILE FROM THE SUBDOMAIN DIRECTORY IF IT EXISTS
RewriteCond $1 !^subs/
RewriteCond %{HTTP_HOST}%{REQUEST_URI} ^([^.]+)\.clan-websites\.com(.*)$
RewriteCond %{DOCUMENT_ROOT}/subs/%1/%2 -f [OR]
RewriteCond %{DOCUMENT_ROOT}/subs/%1/%2 -d
RewriteRule ^(.*)$ subs/%1%2 [L]

#GET THE DEFAULT FILE IF NOT FOUND IN SUBDOMAIN
RewriteCond $1 !^subs/
RewriteCond %{REQUEST_URI} ^(.*)$
RewriteCond %{DOCUMENT_ROOT}/subs/factory/%1 -f [OR]
RewriteCond %{DOCUMENT_ROOT}/subs/factory/%1 -d
RewriteRule ^(.*)$ subs/factory%1 [L]

#SEND THE DATA TO THE SUBDOMAIN CMSMS SINCE NO FILE EXISTS
RewriteCond $1 !^subs/
RewriteCond %{HTTP_HOST}%{REQUEST_URI} ^([^.]+)\.clan-websites\.com(.*)$
RewriteCond %{DOCUMENT_ROOT}/subs/%1/%2 !-f [OR]
RewriteCond %{DOCUMENT_ROOT}/subs/%1/%2 !-d
RewriteRule ^(.*)$ subs/%1/index.php?page=$1 [L]
...