Перенаправить весь трафик сайта в обработчик PHP, подводные камни? - PullRequest
2 голосов
/ 15 января 2012

Я создаю собственный мини-cms с использованием PHP. В настоящее время я использую общую технику перенаправления всех запросов несуществующих файлов к одному индексу PHP и вывода контента на основе пути. Это прекрасно работает для «страниц».

правила Apache mod_rewrite;

   RewriteCond %{REQUEST_FILENAME} !-f
   RewriteCond %{REQUEST_FILENAME} !-d
   RewriteRule ^(.*)$ index.php?q=$1 [L,QSA]

Ресурсные файлы (изображения, CSS, Javascript и т. Д.), Которые фактически существуют как физические файлы, обслуживаются напрямую. Моя проблема здесь заключается в том, что это показывает истинный путь сервера к этим файлам, например.

"/ mycms / сайты / Google / темы / синий / CSS / styles.css"

Я бы предпочел, чтобы этот пример был замаскирован как;

"/ темы / синий / CSS / styles.css"

Поскольку этот запрос не существует, при использовании моей текущей архитектуры он будет перенаправлен в мой обработчик индекса PHP. Я не могу реально добавить правила Apache mod_rewrite для каждого веб-сайта и каждой темы. Поэтому в настоящее время я предполагаю, что единственный способ решить эту проблему - обработать все файлы ресурсов через мой обработчик PHP, используя его для чтения файлов на сервере и выдачи правильного типа содержимого.

Во-первых, если это единственное решение, нужно ли мне быть осторожным, я не уничтожаю какие-либо улучшения производительности, предоставляемые Apache, такие как кэширование запросов?

Во-вторых, по словам Status Quo, есть ли лучший путь?

1 Ответ

1 голос
/ 15 января 2012

Если вы создаете новую CMS, попробуйте добавить прямо сейчас, с самого начала, возможность хранить статические ресурсы в корне сети и ваши php библиотеки вне этого корня сети . Храните в корневом каталоге только файл index.php.

Итак, что дает сначала это дерево:

path/
  \-to/
      \-cms/
         \-www/
             \-index.php
              -static\
                  \-js/ /* cms shared js */
                   -css/ /* cms shared css */
                   -images/ /* cms shared images */
          \-lib/
              \-cms.php /*lots of php files related to the cms*/

Теперь вы хотите работать с несколькими веб-сайтами внутри одной и той же cms и скрыть имя веб-сайта статического ресурса ... Это приводит к двум вопросам:

  • почему обработка нескольких сайтов с одной и той же установкой cms, развертывание cms несколько раз, по одному для каждого сайта обычно лучше, ИМХО. Но в любом случае, почему бы и нет.
  • зачем скрывать имя сайта в URL статического ресурса?

На второй вопрос я вижу только одну причину, чтобы сделать это, это оптимизированная политика кэширования этих активов. Вы хотите сказать, что www.example1.com/static/images/foo.png - это то же изображение, что и www.example2.com/static/images/foo.png. Что-то, что хорошо настроенный обратный прокси может сделать. Но хороший cms также может обрабатывать общий домен для общих статических ресурсов, например: cdn.example.com/static/shared/images/foo.png.

Теперь вы, возможно, на самом деле имеете ужасный URL, как: http://www.example2.com/cms/www.examples2.com/static/images/foo.png. И да, это довольно уродливо, просто потому, что вы можете попытаться проверить некоторые статические ресурсы с example1.com при просмотре example2.com, изменив ссылку вручную. Таким образом, кто-то может отправить URL http://www.seriouswebsite.com/static/images/adultcontent.com/foo.png с заявлением о том, что серьезныеwebsite.com хранит некрасивую картинку, просто потому, что adultcontent.com обрабатывается на том же сервере с теми же CMS. Теперь это не очень важно, сделано в других cms, как, например, в многодоменном управлении по умолчанию в Drupal, например . Я предполагаю, что у вас есть такая ситуация, которую вы не хотите, и вы хотели бы, чтобы ее обрабатывал URL в такой форме: http://www.example2.com/images/foo.png.

Забудьте об управлении статическими файлами с помощью PHP . Статические файлы действительно быстро обрабатываются веб-сервером, и даже больше - кешем обратного прокси. PHP убьет ваши выступления.

Итак, у вас мультидоменное дерево cms сейчас:

path/
  \-to/
      \-cms/
         \-www/
             \-index.php
              -static\
                  \-js/ /* cms shared js */
                   -css/ /* cms shared css */
                   -images/ /* cms shared images */
              -domain1.com/
                  \-static\
                        \-js/
                         -css/
                         -images/
              -domain2.net/
                  \-static\
                        \-js/
                         -css/
                         -images/
          \-lib/
              \-cms.php /*lots of php files related to the cms*/

Одним из решений является rewriteRule для статического контента, с префиксом статического URL-адреса и именем домена, но вы потеряете возможность загружать общие ресурсы cms. Вы все еще можете сделать это, если доменным ресурсам предшествует ключевое слово, например «local».

Итак, чтобы получить:

# private image
/path/to/cms/www/domain1.com/static/images/foo.png => http://domain1.com/static/local/images/foo.png
# shared by the cms
/path/to/cms/www/static/images/foo.png => http://domain1.com/static/images/foo.png

Теперь rewriteRule должен обнаружить часть ' static / local ' и переписать ее в ' static / domain1.com ', когда текущий домен - domain1.com. Что-то подобное (непроверенные):

RewriteRule ^static/local/(.*)$ %{HTTP_HOST}/static/$1 [QSA,L]

Это решение добавляет несколько ограничений:

  • У вас должен быть выделенный virtualHost (лучше) или rewriteRule (для резервных копий .htaccess), переписывающий все альтернативные доменные имена для доступа к каноническому доменному имени для обрабатываемых доменов. Это также лучше для SEO. http://domain1.com/static/images/foo.png будет в порядке, но не http://www.domain1.com/static/images/foo.png или http://foo.domain1.com/static/images/foo.png, и http://DOmaiN1.com/static/images/foo.png следует проверить.
  • Подкаталог, в котором хранятся ресурсы, должен быть назван точно так же, как HHTP_HOST, на это не распространяется.
  • это правило не запрещает использование domain1.com/static/images/foo.png direclty, поэтому пользователи все еще могут создавать плохие ссылки, может быть добавлено некоторое другое rewriteRule с перенаправлениями 301.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...