Сценарий
У меня есть веб-хост, который используется несколькими сайтами, макет каталога выглядит следующим образом:
siteA/
- css/
- js/
- index.php
siteB/
- css/
- js/
- index.php
siteC/
.
.
.
DocumentRoot находится на верхнем уровне, поэтому, чтобы получить доступ к сайту A, вы набираете http://webhost/siteA в своем браузере, чтобы получить доступ к сайту B, вы набираете http://webhost/siteB,
и т. д.
Теперь мне нужно развернуть свой собственный сайт, который был разработан с учетом 3 VirtualHosts, поэтому моя структура выглядит следующим образом:
siteD/
- sites/sitename.com/
- log/
- htdocs/
- index.php
- sites/static.sitename.com
- log/
- htdocs/
- css
- js
- sites/admin.sitename.com
- log/
- htdocs/
- index.php
Как видите, проблема в том, что мои файлы index.php не находятся в каталоге верхнего уровня, в отличие от уже существующих сайтов на веб-хосте.
Каждый VirtualHost должен указывать на соответствующую папку htdocs /:
http://siteD.com -> siteD/sites/sitename.com/htdocs
http://static.siteD.com -> siteD/sites/static.sitename.com/htdocs
http://admin.siteD.com -> siteD/sites/admin.sitename.com/htdocs
проблема
У меня не может быть VirtualHosts на этом хосте, поэтому мне нужно как-то эмулировать его, возможно, с помощью mod_rewrite.
Идея
У меня есть несколько предопределенных частей во всех ссылках на сайте, которые я могу идентифицировать, и направить их в нужный файл с помощью mod_rewrite.
Примеры:
http://webhost/siteD/static/js/something.js -> siteD/sites/static.sitename.com/htdocs/js/something.js
http://webhost/siteD/static/css/something.css -> siteD/sites/static.sitename.com/htdocs/css/something.css
http://webhost/siteD/admin/something -> siteD/sites/admin.sitename.com/htdocs/index.php
http://webhost/siteD/admin/sub/something -> siteD/sites/admin.sitename.com/htdocs/index.php
http://webhost/siteD/something -> siteD/sites/sitename.com/htdocs/index.php
http://webhost/siteD/sub/something -> siteD/sites/sitename.com/htdocs/index.php
Все, что начинается с http://url/sitename/admin/(.*), будет переписано, чтобы указывать на siteD / sites / admin.sitename.com / htdocs / index.php
Все, что начинается с http://url/sitename/static/(.*), будет переписано, чтобы указывать на siteD / sites / static.sitename.com / htdocs / $ 1
Все, что начинается с http://url/sitename/(.*) И , для которого не найдено совпадений, приведенных выше, будет переписано с указанием на siteD / sites / sitename.com / htdocs / index.php
Решение
Вот файл .htaccess, который я придумал:
RewriteEngine On
RewriteBase /
RewriteCond %{REQUEST_URI} ^/siteD/static/(.*)$ [NC]
RewriteRule ^siteD/static/(.*)$ siteD/sites/static/htdocs/$1 [L]
RewriteCond %{REQUEST_URI} ^/siteD/admin/(.*)$ [NC]
RewriteRule ^siteD/(.*)$ siteD/sites/admin/htdocs/index.php [L,QSA]
Пока все хорошо. Это все работает. Теперь добавим последнее правило:
RewriteCond %{REQUEST_URI} ^/siteD/(.*)$ [NC]
RewriteRule ^siteD/(.*)$ siteD/sites/public/htdocs/index.php [L,QSA]
И он сломан. Последнее правило ловит все, даже те, которые имеют статические / или admin / в них.
Зачем? Не должен ли флаг [L] остановить процесс перезаписи в первых двух случаях? Почему оценивается третий случай?
Есть ли лучший способ решить это? Я не зацикливаюсь на переписывании, все в порядке, если ему не нужен доступ к конфигурации на уровне сервера.
У меня нет доступа к RewriteLog или чему-то в этом роде.
Пожалуйста, помогите: (