Назад | Перейти на главную страницу

Проблема перезаписи HTACCESS

У меня такая структура папок:

/var/www/mysite/abc/
/var/www/mysite/def/
/var/www/mysite/fgh/
/var/www/mysite/ijk/
/var/www/mysite/portal/
/var/www/mysite/wyz/

Сегодняшний мой сервер перенаправляет все запросы www.mydomain.com к www.mydomain.com/portal и это нормально ...

Но я хочу изменить это поведение и оставить www.mydomain.com доступ к /var/www/mysite/portal/ папка на фоне, пока www.mydomain.com/abc/ все еще доступ к /var/www/mysite/abc/ папка как раньше.

Это то, что я безуспешно пробовал на моем htaccess:

IndexIgnore *
Options +FollowSymlinks

<IfModule mod_rewrite.c>
    RewriteEngine On
    #This doesn't work!!!
    #RewriteCond %{REQUEST_URI} !^abc
    #Neither this :\
    #RewriteCond %{REQUEST_URI} !^/abc
    RewriteCond %{REQUEST_FILENAME} !-d
    RewriteCond %{REQUEST_FILENAME} !-f

    RewriteRule ^$ /portal/index.php [L]
    RewriteRule . /portal/index.php [L]
</IfModule>

Все запросы продолжаются www.mydomain.com/portal/ когда я использую этот .htaccess (с комментариями или без них)

Попробуйте добавить это в свою http-конфигурацию (где-то в конфигурации она не работает на уровне htaccess или virtualhost)

RewriteLog /tmp/rewrite.log
RewriteLogLevel 9

Это предоставит вам построчное объяснение того, что он пытается сопоставить с каким регулярным выражением, и каково окончательное решение.

Удалите эти строки после этого, иначе однажды вы обнаружите, что у вас не так много места на диске, как вы думали ...

Вы можете попробовать использовать условия REQUEST_FILENAME наоборот - например, сказать «если REQUEST_FILENAME существует (и является файлом / каталогом / символической ссылкой), не переписывайте его» - что-то вроде

RewriteCond  %{REQUEST_FILENAME} -f    [OR]
RewriteCond  %{REQUEST_FILENAME} -d    [OR]
RewriteCond  %{REQUEST_FILENAME} -l
RewriteRule ^.*$ - [L]

Это правило перезаписи означает «позволить запросу пройти нетронутым», а флаг [L] должен останавливать обработку перезаписи, не затрагивая перезаписи портала ниже.

Помимо этого, я бы предложил использовать RewriteLog и RewriteLogLevel (по крайней мере, уровень 3), чтобы получить дополнительную информацию о том, почему условия не совпадают правильно.

я хотел бы использовать

Alias /abc /var/www/mysite/abc

хотя это не входит в файл .htaccess, его необходимо поместить в VirtualHost блок конфигурации.

Если у вас нет доступа к конфигурации виртуального хоста, попробуйте

RewriteRule ^/abc(.*) /var/www/mysite/abc$1

но убедитесь, что это идет перед ваши существующие правила.

РЕДАКТИРОВАТЬ: в ответ на ваш комментарий, возможно, самым простым решением было бы сделать это:

DocumentRoot /var/www/mysite/
Alias / /var/www/mysite/portal/

Но если это неприемлемо, вы можете использовать AliasMatch:

AliasMatch ^/(abc|def|fgh|...)(.*)$ /var/www/mysite/$1$2

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