mod_rewrite игнорирует правила в подкаталогах - PullRequest
0 голосов
/ 23 июня 2011

Требуется поведение при перезаписи (внутренняя перезапись!)

http://<subdomain>.domain.tld/<path> -> /<subdomain>/<path>
http://www.domain.tld/path/file.php  -> /www/path/file.php
http://project.domain-tld/index.php  -> /project/index.php

Структура папок:

/                        root
    .htaccess
    /www                 www.domain.tld
        index.php
        /www
            file.php
        /foo
            /bar
                file.php
    /project             project.domain.tld
        index.php
        someRandomFiles
    /somesubdomain       somesubdomain.domain.tld
        index.php
        someRandomFiles
    /anothersubdomain    anothersubdomain.domain.tld
         index.php
         someRandomFiles

Полный .htaccess

# Unicode
AddDefaultCharset utf-8

# Activate mod_rewrite
RewriteEngine on
RewriteBase /

# Subdomains
#  Extract (required) subdomain (%1), and first path element (%3), discard port number if present (%2)
RewriteCond %{HTTP_HOST}<>%{REQUEST_URI} ^([^.]+)\.janbuschtoens\.de(:80)?<>/([^/]*) [NC]
#  Rewrite only when subdomain not equal to first path element (prevents mod_rewrite recursion)
RewriteCond %1<>%3 !^(.*)<>\1$ [NC]
#  Rewrite to /subdomain/path
RewriteRule ^(.*) /%1/$1 [L]

Мой .htaccess, кажется, работает. Вы можете проверить это здесь:

Но в подкаталогах есть странное поведение. mod_rewrite, похоже, игнорирует правило, если первый каталог в запрошенном пути имеет то же имя, что и сам поддомен. Например:

Для другого живого теста:

Кажется, что правило игнорируется.

1 Ответ

1 голос
/ 23 июня 2011

Это единственное хорошее правило, которое я смог придумать, иначе после первоначального переписывания (что очень легко) оно входит в цикл (и это проблема). Например: www.domain.com/www/123.png правильно перенаправляется в /www/www/123.png, но затем переходит к следующему циклу, где перенаправляется на /www/www/www/123.png, а затем снова и снова.

Это правило ТОЛЬКО вызывается, если ФИНАЛЬНОЕ имя файла СУЩЕСТВУЕТ .

RewriteCond %{HTTP_HOST} ^(.+)\.domain\.com$
RewriteCond %{DOCUMENT_ROOT}/%1/$1 -f [OR]
RewriteCond %{DOCUMENT_ROOT}/%1/$1 -d
RewriteRule ^(.*)$ /%1/$1 [QSA,L]

Например: если вы запрашиваете www.domain.com/www/123.png, а файл / папка WEBSITEROOT/www/www/123.png существуют, то он будет перезаписан, иначе ничего.

То же самое здесь: если вы запрашиваете meow.domain.com/ .. но у вас нет папки WEBSITEROOT/meow/ на вашем диске, это ни к чему не приведет.

Обратите внимание, это все равно мало поможет, если у вас есть подпапка с тем же именем, что и субдомен. Например: если вы запрашиваете www.domain.com, его следует переписать в WEBSITEROOT/www/ ... но если у вас также есть WEBSITEROOT/www/www/, то (из-за цикла) он будет переписан в WEBSITEROOT/www/www/.

К сожалению, я не нашел способ, как обойти это. Если хотите - можете попробовать объединить свои правила с моими.

...