2013-03-19 6 views
1

im здание сайта с большим количеством параметров. В настоящее время я использую этот код в моем файле .htaccess:Mod Rewrite - есть ли более быстрый способ?

Options +FollowSymLinks 
RewriteEngine on 
RewriteBase /epo 

RewriteRule (.*)/(.*)/(.*)/(.*)/(.*)/$ index.php?section=$1&content=$2&site=$3&param=$4&param2=$5 [QSA] 
RewriteRule (.*)/(.*)/(.*)/(.*)/$ index.php?section=$1&content=$2&site=$3&subsite=$4 [QSA] 
RewriteRule (.*)/(.*)/(.*)/$ index.php?section=$1&content=$2&site=$3 [QSA] 
RewriteRule (.*)/(.*)/$ index.php?section=$1&content=$2 [QSA] 
RewriteRule (.*)/$ index.php?section=$1 [QSA] 

RewriteCond %{REQUEST_URI} ^/[^\.]+[^/]$ 
RewriteRule ^(.*)$ http://%{HTTP_HOST}%{REQUEST_URI}/ [R=301,L] 

Я новичок в mod_rewrite, вот почему этот код является беспорядок. Есть ли лучший способ справиться со всеми этими параметрами? Последние две строки только что добавят «/» в конце, если их нет. Было бы замечательно, если бы кто-то мог объяснить их код, поэтому я могу понять, что я сделал неправильно :)

+2

прочитать мой ответ здесь http://stackoverflow.com/questions/14637335/url-rewriting-in-php-when-several- value-are-being-through-in-the url/14637516 # 14637516 – bitWorking

+0

Downvote не нужен - для меня это выглядит как правильный вопрос. Я второй ссылку выше, но с контекстом - это полезно, когда у вас есть сложные правила И возможность использовать стиль архитектуры «front-controller» для перенаправления всех запросов на ваш index.php, а затем делать исключения (например, для изображений, js, css и т. д.). – MyStream

+0

спасибо за эту ссылку, но я не полностью ее угадываю: что вы имеете в виду под «С помощью этих правил все для forwared для index.php. Таким образом, вы можете реализовать каждую логику url с помощью PHP». Можете ли вы предоставить мне простой пример PHP, поэтому я могу использовать ваш код mod_rewrite? Заранее спасибо – Daniel

ответ

1

Лично я перенаправляю весь запрос в один файл, а затем обрабатываю его оттуда.

RewriteRule ^(.*)$ index.php?path=$1 [QSA] 

А затем в index.php использования что-то вроде

$params = explode('/', $_GET['path']; 

$section = $params[0]; 
$content = $params[1]; 
$site = $params[2]; 
$subsite = $params[3]; 
//etc. 

Имейте в виду, что вам нужны дополнительные проверки по всем параметрам

+0

Спасибо, это лучший способ иметь дело с несколькими параметрами? Я всегда боюсь замедления, вызванного всеми этими параметрами :) Другой вопрос: какая еще проверка нужна мне для этих параметров? – Daniel

+0

В зависимости от ваших настроек '$ params [3]' может дать предупреждение, если установлены только 2 параметра. Также используйте регулярную проверку, чтобы убедиться, что параметры - это то, что вы ожидаете от них.(numeric или string, sql escape it и т. д.) –

+0

Большое спасибо, теперь я получу его :) Я использовал ваш код и использовал цикл foreach, чтобы проверить, установлены ли параметры. – Daniel

1

Это похоже на примере Гюго, но без GET парам :

<IfModule mod_rewrite.c> 
    SetEnv HTTP_MOD_REWRITE On 
    RewriteEngine On 
    RewriteCond %{REQUEST_FILENAME} -s [OR] 
    RewriteCond %{REQUEST_FILENAME} -l [OR] 
    RewriteCond %{REQUEST_FILENAME} -d 
    RewriteRule ^.*$ - [NC,L] 
    RewriteRule ^.*$ index.php [NC,L] 
</IfModule> 

PHP Вы можете сделать следующее:

$pathInfo = pathinfo($_SERVER['SCRIPT_NAME']); 
$baseUrl = $pathInfo['dirname']; 
$baseFile = $pathInfo['basename']; 
$url = rtrim(str_replace([$baseUrl, '/'.$baseFile], '', $_SERVER['REQUEST_URI']), '/'); 
$method = strtolower($_SERVER['REQUEST_METHOD']); 
$isModRewrite = array_key_exists('HTTP_MOD_REWRITE', $_SERVER); 

Ваш URL, теперь может выглядеть примерно так:

http://www.yourserver.com/param1/param2 

ИЛИ (если мод перезапись не включен)

http://www.yourserver.com/index.php/param1/param2 

В обоих направлениях переменная $url выглядит как /param1/param2

Вы можете сделать explode на этой строке или отправьте библиотеку маршрутизации PHP этой строкой для извлечения ваших параметров.

PHP Пример маршрутизации библиотеки:

https://github.com/robap/php-router

https://github.com/deceze/Kunststube-Router

+0

Спасибо за ваш код, и я тоже могу избавиться от параметра GET :) Этот код работает для меня. – Daniel