Apache mod_rewrite сводит меня с ума - PullRequest
0 голосов
/ 08 апреля 2010

Сценарий

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

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 или чему-то в этом роде. Пожалуйста, помогите: (

1 Ответ

1 голос
/ 08 апреля 2010

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

RewriteCond %{REQUEST_URI} !^/siteD/static/(.*)$ [NC]
RewriteCond %{REQUEST_URI} !^/siteD/admin/(.*)$ [NC]
RewriteRule ^siteD/(.*)$ siteD/sites/public/htdocs/index.php [L,QSA]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...