Apache .htaccess RewriteRule - PullRequest
       0

Apache .htaccess RewriteRule

0 голосов
/ 10 ноября 2011

Вот моя ситуация. У меня есть веб-корень и несколько подкаталогов, скажем:

/var/www
/var/www/site1
/var/www/site2

Из-за определенных ограничений мне нужна возможность хранить один домен и иметь отдельные папки, подобные этой. Это будет хорошо работать для меня, но многие ссылки на JS и CSS на обоих сайтах указывают на такие вещи, как:

"/js/file.js"
"/css/file.css"

Поскольку на эти файлы ссылаются абсолютно, они ищут каталоги 'js' и 'css' в / var / www, которых, конечно, не существует. Есть ли способ использовать RewriteRules для перенаправления запросов на абсолютно ссылочные файлы, чтобы указать на правильный подкаталог? Я пытался делать такие вещи, как:

RewriteEngine on
RewriteRule ^/$ /site1

или

RewriteEngine on
RewriteRule ^/js/(.*)$ /site1/js/$1
RewriteRule ^/css/(.*)$ /site1/css/$1

Но ни одна из этих работ, даже перенаправление только в один каталог, не говоря уже об обработке и site1, и site2. Возможно ли то, что я пытаюсь?

РЕДАКТИРОВАТЬ: РЕШЕНИЕ

В итоге я адаптировал совет Джона к своей ситуации. У меня есть возможность программно вносить изменения в мой файл .htaccess при каждом добавлении или удалении нового подкаталога. Для каждого «сайта», который я хочу, у меня есть следующий раздел в моем .htaccess:

RewriteCond %{REQUEST_URI} !^/$
RewriteCond %{REQUEST_URI} !^/index.php$
RewriteCond %{HTTP_COOKIE} sitename=site1
RewriteCond %{REQUEST_URI} !^/site1/
RewriteRule ^(.*)$ /site1/$1 [L]

Index.php - это файл, который перечисляет все мои сайты, удаляет cookie «sitename» и устанавливает cookie «sitename = site #», когда выбирается конкретный. Моя проверка RewriteConds,

  1. Если запрос не для /
  2. Если запрос не для /index.php
  3. Если запрос содержит файл cookie "sitename = site1"
  4. Если запрос не начинается с "/ site1 /"

Если все эти условия выполнены, то запрос переписывается с добавлением "/ site1 /" перед запросом. Я попытался использовать один набор правил / правил, которые соответствовали бы (\ w +) вместо "site1" в третьем условии, а затем ссылались на% 1 в четвертом условии и в правиле, но это не сработало. Я сдался и согласился на это.

Ответы [ 2 ]

1 голос
/ 10 ноября 2011

Если RewriteRules находятся в вашем файле .htaccess, вам необходимо удалить начальные косые черты в вашем совпадении (apache удаляет их перед отправкой в ​​mod_rewrite).Это работает?

RewriteEngine on
RewriteRule ^js/(.*)$ /site1/js/$1
RewriteRule ^css/(.*)$ /site1/css/$1

РЕДАКТИРОВАТЬ: Чтобы ответить на комментарий:

Да, это работает, но когда я делаю RewriteRule ^(.*)$ /site1/$1, это вызывает Apache для выдачи внутренних ошибок сервера,Но мне кажется, что это должен быть просто общий эквивалент отдельных правил!

То, что происходит с этим правилом, происходит, когда /something/ переписывается в /site/something/, и Apache внутренне перенаправляет,он переписывается снова , /site/site/something/, затем снова, затем снова и т. д.

Вам необходимо добавить к этому условие, что-то вроде:

RewriteCond %{REQUEST_URI} !^/site/
RewirteRule ^(.*)$ /site/$1 [L]
0 голосов
/ 10 ноября 2011

Вам необходимо настроить символические ссылки , которые будут использовать правила перезаписи, чтобы ваши абсолютные ссылки на уровне сервера могли переходить по символическим ссылкам на учетную запись хостинга центрального сайта.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...