Переписать правило ссылки, конфликтующие файлы и папки - PullRequest
2 голосов
/ 16 марта 2012

Попытка решить эту проблему с помощью правила перезаписи, которое назначает поддомен корневому каталогу с тем же именем, например.

ddd.example.com будет ссылаться на каталог "/ _projects / ddd", который работает нормально, и у меня нет проблем с этим, проблема в том, что любые файлы или каталоги, которые у меня есть в корневом каталоге "/", доступны с субдомена ddd.example.com.

Вот пример структуры каталогов

example.com = "/"

  • "index.php"

ddd.example.com = "/ _projects / ddd"

  • нет файлов

Так что, если, например, я захожу на ddd.example.com/index.php, он разрешит использовать файл, расположенный на example.com/index.php, который находится в каталоге ниже.

Вот правило перезаписи для .htaccess

# Skip rewrite if subdomain is www 
RewriteCond %{HTTP_HOST} !^www\. [NC] 

# Extract (required) subdomain to %1 
RewriteCond %{HTTP_HOST} ^([^.]+)\.example\.com(:80)?$

# Redirect to domain if requested URL does not resolve to existing subdirectory path
RewriteCond %{DOCUMENT_ROOT}/_projects/%1 !-d
RewriteRule (.*) http://example.com/ [NC,R=301]

# Skip rewrite if subdomain is www 
RewriteCond %{HTTP_HOST} !^www\. [NC]

# Extract (required) subdomain to %1 
RewriteCond %{HTTP_HOST} ^([^.]+)\.example\.com(:80)?$

# Skip rewrite if requested URL does not resolve to existing subdirectory path or file
RewriteCond %{DOCUMENT_ROOT}/_projects/%1/$1 -f [OR]
RewriteCond %{DOCUMENT_ROOT}/_projects/%1/$1 -d
RewriteRule (.*) /_projects/%1/$1 [NC,L] 

Ответы [ 3 ]

0 голосов
/ 17 марта 2012

Моя попытка переписать была сделать это по существу.

Псевдокод:

if (subdomain-directory != exists)
    redirect them to the home page
else
    rewrite the request for the subdomain

Я мог добиться этого только по двум правилам, я не нашел другого способа сделать это, поэтому это была моя попытка.

Условие, о котором идет речь, на самом деле работает нормально, если у меня есть index.php в каталоге / _projects / sub, то он будет использовать этот файл и то же самое для любого другого файла, который я там поместил.

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

0 голосов
/ 17 марта 2012

Устранена проблема, похоже, возникла проблема с циклом, которая прерывала перезапись.

##### Subdomain to subfolder
# Fix missing trailing slashes.
#RewriteCond %{HTTP_HOST} !^(www\.)?example\.com$ [NC]
#RewriteCond %{HTTP_HOST} ^(www\.)?([^\.]+)\.example\.com$ [NC]
#RewriteCond %{DOCUMENT_ROOT}/%2%{REQUEST_URI}/ -d
#RewriteRule [^/]$ %{REQUEST_URI}/ [R=301,L]

# Rewrite sub domains.
RewriteCond %{ENV:REDIRECT_STATUS} ^$
RewriteCond %{HTTP_HOST} !^(www\.)?example\.com$ [NC]
RewriteCond %{HTTP_HOST} ^(www\.)?([^\.]+)\.example\.com$ [NC]
RewriteRule ^(.*)$ /projects/%2/$1 [QSA,L]
0 голосов
/ 17 марта 2012

Что, если ваш RewriteConds потерпит неудачу? Тогда URL проваливается и не переписывается. И поэтому он получает доступ к корню документа. Я бы просто создал отдельные записи VirtualHost для каждого поддерживаемого поддоменов. (Сколько их там?)

Предположим, клиент запрашивает http://sub.example.com/index.php.

Предположим, что существует /_projects/sub/index.php.

Ваши RewriteCond -s увидят, что /_projects/sub/index.php существует в виде файла, а затем пропустят перезапись. Но если перезапись пропущена, перенаправление на /_projects/sub/ отсутствует. Так какой документ выбирается в этом случае? Вы догадались, /index.php.

Вы должны безоговорочно перенаправить эти субдомены в их соответствующие места (при условии проверки только зацикливания).

Почему вы разделили переписывание на две части, одна из которых выполняла внутреннее перенаправление? Внутренний редирект не переписывает весь URL-адрес в example.com, поэтому он остается в поддомене. Похоже, что вы можете попасть в петлю там.

...