А что лучше разбирать, 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, время: 18:21. |