htaccess mod_rewrite RewriteRule - передать get параметры
Есть RewriteRule
Код:
RewriteRule ^(([^\\/]+/)*[^\./\\]+\.raed\(tmpl\))$ templator/manager.php?file=$1&$4 Попробовал исправить так: RewriteRule ^(([^\\/]+/)*[^\./\\]+\.raed\(tmpl\))*!*(\?([./]+))?*/!*$ templator/manager.php?file=$1*!*&$4*/!* Не помогло. Подскажите, в чём ошибка |
RewriteRule ^(([^\\/]+/)*[^\./\\]+\.raed\(tmpl\))$ templator/manager.php?file=$1&$4 [QSA] |
Цитата:
И ещё вопрос, какой синтаксис у регулярных выражений в htaccess, PCRE или какой-то другой |
Раед,
сохранил эту статью, на всякий случай, держи: http://beget.ru/art_htaccess |
9xakep,
Спасибо, наконец-то нашлось что-то адекватное, а то обычно в статьях на эту тему одни примеры |
Цитата:
|
Цитата:
|
Цитата:
|
Цитата:
По крайней мере, судя по вашему посту Цитата:
|
observer, прав. тем более, что такое решение гибче.
такой способ я видел, когда просматривал сорцы LiveStreet... вот пример |
А что лучше разбирать, REQUEST_URI или REDIRECT_URL
|
вот мой вариант на всех сайтах:
DirectoryIndex index.php RewriteEngine On # Если запрос файла не index.php RewriteCond %{REQUEST_FILENAME} !/index.php$ # и если запрос исполняемого файла, то-есть с расширением .php RewriteCond %{REQUEST_FILENAME} .php$ # то добавим GET переменную с именем запрашиваемого # исполняемого файла, которую у меня движок обрабатывает # это правило дает возможность обойти проблему с запуском # того что не желательно запускать напрямую RewriteRule ^(.*) index.php?httpd_include_file=%{REQUEST_FILENAME} [QSA,L] # Все прочие запросы кроме файлов ресурсов проходят через index.php RewriteCond %{REQUEST_FILENAME} !-f RewriteRule ^(.*) index.php [L]ну и сам index.php выглядит так: <?php /* * Загружаем базовый файл конфигураций */ include_once dirname( __FILE__ )."/bootstrap.php"; /* * Данный скрипт требуется для безопасности, так как все запросы проходят через индексный файл * если запрос просит файл с рассширением .php * обрабатываем это правило */ if ( isset( $_GET['httpd_include_file'] ) ) { /* * Разрешения на доступ к файлам * ключ: содержит ссылку на файл требующий обращения, начиная от _DOCUMENT_ROOT * значение: это цифра указывающая на метод доступа * * 0 - это значение разрешает обращатся к файлу только через AJAX * 1 - это значение разрешает обращатся любым доступным методом */ $allow_include = array( "/general/services/topdomain.php" => 0, ); foreach( $allow_include as $allow_file => $access_method ) { if ( ( _DOCUMENT_ROOT.$allow_file == $_GET['httpd_include_file'] ) && ( ( ( $access_method == 0 ) && ( _IS_AJAX ) ) || ( $access_method == 1 ) ) ) { $include_file = $_GET['httpd_include_file']; unset( $_GET['httpd_include_file'] ); // Если разрешения позволяют, переходим на данный скрипт и выходим include_once $include_file; exit; } } } /* * Пердаем управление ядру */ include_once _INC_PATH."general/core.php"; ?>Если в списке массива $allow_include не указан путь к файлу .php к которому разрешено обращатся напрямую, то запустить его будет не возможно указав путь в адресной строке браузера. Это защита позволяет уйти от таких проблем как ошибочный запуск не желательного, многие это решают добавлением в каждый файл подобной строки: if ( !defined( "SITE_PATH" ) ) { exit( "Hacking attempt!" ); }но мне этого делать не приходится. |
Цитата:
|
Цитата:
Цитата:
Цитата:
|
Цитата:
|
Просто проверил:
Поставил редирект на один файл и отпринтил $_SERVER при запросе корневой директории: Array ( [REDIRECT_STATUS] => 200 [HTTP_HOST] => d-m [HTTP_USER_AGENT] => Mozilla/5.0 (Windows NT 5.1; rv:12.0) Gecko/20100101 Firefox/12.0 [HTTP_ACCEPT] => text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8 [HTTP_ACCEPT_LANGUAGE] => ru-ru,ru;q=0.8,en-us;q=0.5,en;q=0.3 [HTTP_ACCEPT_ENCODING] => gzip, deflate [HTTP_CONNECTION] => keep-alive [PATH] => \usr\local\ImageMagick;\usr\local\php5;C:\WINDOWS\system32;C:\WINDOWS;C:\WINDOWS\System32\Wbem [SystemRoot] => C:\WINDOWS [COMSPEC] => C:\WINDOWS\system32\cmd.exe [PATHEXT] => .COM;.EXE;.BAT;.CMD;.VBS;.VBE;.JS;.JSE;.WSF;.WSH [WINDIR] => C:\WINDOWS [SERVER_SIGNATURE] => <address>Apache/2.2.4 (Win32) mod_ssl/2.2.4 OpenSSL/0.9.8d PHP/5.2.4 Server at d-m Port 80</address> [SERVER_SOFTWARE] => Apache/2.2.4 (Win32) mod_ssl/2.2.4 OpenSSL/0.9.8d PHP/5.2.4 [SERVER_NAME] => d-m [SERVER_ADDR] => 127.0.0.1 [SERVER_PORT] => 80 [REMOTE_ADDR] => 127.0.0.1 [DOCUMENT_ROOT] => Z:/home/d-m/www [SERVER_ADMIN] => admin@localhost [SCRIPT_FILENAME] => Z:/home/d-m/www/url_manager.php [REMOTE_PORT] => 2216 *!* [REDIRECT_URL] => /index.raed(tmpl) [REQUEST_URI] => / */!* [GATEWAY_INTERFACE] => CGI/1.1 [SERVER_PROTOCOL] => HTTP/1.1 [REQUEST_METHOD] => GET [QUERY_STRING] => [SCRIPT_NAME] => /url_manager.php [PHP_SELF] => /url_manager.php [REQUEST_TIME] => 1338929770 [argv] => Array ( ) [argc] => 0 ) Это нормально? |
Что-то вы не то делаете.
Вам нужна переменная окружения REQUEST_URI, возьмите ее из через getenv или $_SERVER. Все. Ваш .htaccess может выглядеть так: Код:
RewriteEngine On В индексном файле, что-то наподобие $request = getenv("REQUEST_URI"); $requestPairs = explode($request); Все. В массиве у вас все кусочки пути. Дальше уже включается в работу логика приложения. |
Цитата:
Код:
# Всех посылаем на url_manager.php |
observer,
да что у вас совсем перебор в .htaccess, зачем столько лишних действий не понимаю. Цитата:
|
Часовой пояс GMT +3, время: 19:58. |