2010-11-02 2 views
0

Я хотел бы направить все запросы url в один файл php. Это также включает в себя любые запросы к изображениям и файлам javascript, которые будут направлены на этот единственный файл php.Могу ли я сделать общий скрипт php с htaccess?

Почему? Например, это позволит мне отправить в браузер сжатую версию файла javascript.

Как это можно сделать лучше всего, и каковы могут быть плюсы и минусы?

+0

Возможный дубликат [url rewriting index.php] (http://stackoverflow.com/questions/2652701/url-rewriting-index-php) - используйте 'mod_rewrite' – Gordon

+0

, возможно, связанный с [Включить' mod_deflate' для отправки кодирование содержимого gzip] (http://stackoverflow.com/questions/878068/enable-mod-deflate-to-send-content-encoding-gzip) – Gordon

+0

Итак, даже если файл существует, вы хотите, чтобы произошла переадресация? – webbiedave

ответ

3

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

метод должен был бы поместить следующее в ваш файл .htaccess:

RewriteEngine On 
RewriteBase/
RewriteRule (.*) parse-request.php 

Это будет посылать запрос непосредственно разобрать-request.php. Что еще более важно, поскольку запрос не передается как переменная GET (например, parse-request.php?request=my/webapp/index.php), немного сложнее обмануть ваш сервер и немного сложнее для людей осознать, что есть даже фронт-парсинг.

разбора request.php должны затем включить что-то вроде следующего:

<?php 
    $url = parse_url($_SERVER["REQUEST_URI"]); 
    $extension = substr($url["path"], strrchr($url["path"], '.')+1); 
    switch($extension){ 
     case "zip": $ctype = "application/zip"; break; 
     case "jpeg": 
     case "jpg": $ctype = "image/jpg"; break; 
     case "php": 
     case "html": $ctype = "text/html"; break; 
     case "css": $ctype = "text/css"; break; 
     case "js": $ctype = "text/javascript"; break; 
    } 
    header("Content-type: ".$ctype); 
    /* 
     Now determine how to display each one 
    */ 
    if($extension == "js"){ 
     // minify and output 
    } else if ($extension == "php"){ 
     require($url["path"]); // run the PHP file 
     // Note that certain variables in PHP believe you are in the subdirectory of parse-request.php 
     // You have to account for this in your webapp 
    } else... 
     ... 
     ... 
    } 
?> 

Это основная идея. Конечно, вы можете бесконечно расширять это, говоря такие вещи, как «Если пользователь вошел в систему, обслуживайте изображение. Если нет, откройте« Зарегистрироваться для просмотра изображения ». Хотя, как уже было сказано, это вызывает много накладных расходов и замедляет ваш сайт. Лучший способ состоит в том, чтобы иметь несколько способов анализа любой информации, которую вы на самом деле хотите изменить, а не единственный способ разобрать ВСЕ. Например, с вашего файла .htaccess:

RewriteEngine On 
RewriteBase/
RewriteRule (.*).js minify-js.php 
RewriteRule (.*).css parse-css.php 
RewriteRule secretimages/(.*).jpg hide-images.php 
RewriteRule profile.html are-you-logged-in.php 

Разделив на работу среди различных сценариев вы работать только то, что необходимо, уменьшая накладные расходы много. Кроме того, таким образом, любые изображения, которые не находятся в папке «secretimages», могут быть напрямую переданы Apache без необходимости загрузки парсера PHP. В любом случае, любой контент, который вы только что прошли.

Главное, однако, состоит в том, что путем выбора отдельных элементов для разбора по-разному вам не нужно перекодировать любые веб-приложения. Я гарантирую, что MediaWiki или что-то будет NOT, как и все их параметры URI, которые изменяются интерфейсным синтаксическим анализатором.

2

Чтобы ответить на часть, которая не является дубликатом:

Маршрутизация всех доступ через единый ресурс называется FrontController. Это общий шаблон, но он должен обрабатывать запросы к приложению , а не до любого ресурса на веб-сервере.

Передача всех (как в самом деле всех) запросов к index.php - полная трата ресурсов. Ваш index.php должен будет определить, что обслуживать по каждому запросу, эффективно сделав его веб-сервером. Это не то, что он должен делать, и это тоже не то, на что это хорошо.

Кроме того, я предполагаю, что вы хотите минимизировать свой JS-файл каждый раз, когда он запрашивается. Зачем это делать, когда вы можете сделать это один раз, а затем обслуживать мини-версию для каждого запроса вместо этого, полностью используя кеширование и сжатие веб-сервера, вместо того, чтобы переопределять это из PHP-скрипта?

+0

Он не будет создавать сокращенную версию. он отправит мин версию, если существует, если она не существует, она отправит оригинал. – bkilinc

+0

@bkilinc, это все еще не повод для обслуживания через PHP. Вы можете обработать минимизацию во время развертывания или просто включить условное выражение в шаблон. – Gordon

Смежные вопросы