Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #11 (permalink)  
Старый 06.06.2012, 00:24
Аватар для Раед
''
Отправить личное сообщение для Раед Посмотреть профиль Найти все сообщения от Раед
 
Регистрация: 11.12.2011
Сообщений: 636

А что лучше разбирать, REQUEST_URI или REDIRECT_URL
Ответить с цитированием
  #12 (permalink)  
Старый 06.06.2012, 00:28
что-то знаю
Отправить личное сообщение для devote Посмотреть профиль Найти все сообщения от devote
 
Регистрация: 24.05.2009
Сообщений: 5,176

вот мой вариант на всех сайтах:
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!" );
}
но мне этого делать не приходится.
__________________
хм Russians say завтра but завтра doesn't mean "tomorrow" it just means "not today."
HTML5 history API рассширение для браузеров не поддерживающих pushState, replaceState
QSA CSS3 Selector Engine
Ответить с цитированием
  #13 (permalink)  
Старый 06.06.2012, 00:28
что-то знаю
Отправить личное сообщение для devote Посмотреть профиль Найти все сообщения от devote
 
Регистрация: 24.05.2009
Сообщений: 5,176

Сообщение от Раед
А что лучше разбирать, REQUEST_URI или REDIRECT_URL
REQUEST_URI конечно, ибо REDIRECT_URL не всегда определен
__________________
хм Russians say завтра but завтра doesn't mean "tomorrow" it just means "not today."
HTML5 history API рассширение для браузеров не поддерживающих pushState, replaceState
QSA CSS3 Selector Engine
Ответить с цитированием
  #14 (permalink)  
Старый 06.06.2012, 00:47
Аватар для Раед
''
Отправить личное сообщение для Раед Посмотреть профиль Найти все сообщения от Раед
 
Регистрация: 11.12.2011
Сообщений: 636

Сообщение от devote
REQUEST_URI конечно, ибо REDIRECT_URL не всегда определен
Если я правильно понял, то он определён всегда, когда был выполнен редирект => это то, что мне нужно. Или я неправильно понял?

Сообщение от devote
вот мой вариант на всех сайтах
Что-то я не понял, что происходит, если идёт обращение к файлу с расширением не .php

Сообщение от devote
Если в списке массива $allow_include не указан путь к файлу .php к которому разрешено обращатся напрямую, то запустить его будет не возможно указав путь в адресной строке браузера.
Это же почти все php файлы в массив класть придётся. Или я опять что-то не понял?

Последний раз редактировалось Раед, 06.06.2012 в 00:52.
Ответить с цитированием
  #15 (permalink)  
Старый 06.06.2012, 00:53
что-то знаю
Отправить личное сообщение для devote Посмотреть профиль Найти все сообщения от devote
 
Регистрация: 24.05.2009
Сообщений: 5,176

Сообщение от Раед
Если я правильно понял, то он определён всегда, когда был выполнен редирект => это то, что мне нужно. Или я неправильно понял?
его определяет apache тоесть если в .htaccess он наткнулся на правило и сделал редирект, то он его определяет. При отсутствии правил в .htaccess это переменная будет не определена.
__________________
хм Russians say завтра but завтра doesn't mean "tomorrow" it just means "not today."
HTML5 history API рассширение для браузеров не поддерживающих pushState, replaceState
QSA CSS3 Selector Engine
Ответить с цитированием
  #16 (permalink)  
Старый 08.06.2012, 00:25
Аватар для Раед
''
Отправить личное сообщение для Раед Посмотреть профиль Найти все сообщения от Раед
 
Регистрация: 11.12.2011
Сообщений: 636

Просто проверил:
Поставил редирект на один файл и отпринтил $_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
)

Это нормально?
Ответить с цитированием
  #17 (permalink)  
Старый 08.06.2012, 19:54
Аспирант
Отправить личное сообщение для observer Посмотреть профиль Найти все сообщения от observer
 
Регистрация: 11.11.2011
Сообщений: 96

Что-то вы не то делаете.

Вам нужна переменная окружения REQUEST_URI, возьмите ее из через getenv или $_SERVER. Все.

Ваш .htaccess может выглядеть так:

Код:
RewriteEngine On

RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_URI} !/$
RewriteRule ^(.*)$  http://%{SERVER_NAME}/$1/ [L,R=301]

RewriteCond %{REQUEST_FILENAME} -d [OR]
RewriteCond %{REQUEST_FILENAME} -f
RewriteRule ^(.*)$ - [L]

RewriteCond %{REQUEST_URI} ^/
RewriteRule ^(.*)$ index.php [L]

В индексном файле, что-то наподобие

$request = getenv("REQUEST_URI");
$requestPairs = explode($request);

Все. В массиве у вас все кусочки пути. Дальше уже включается в работу логика приложения.
Ответить с цитированием
  #18 (permalink)  
Старый 08.06.2012, 20:02
Аватар для Раед
''
Отправить личное сообщение для Раед Посмотреть профиль Найти все сообщения от Раед
 
Регистрация: 11.12.2011
Сообщений: 636

Сообщение от observer
Ваш .htaccess может выглядеть так
Эээ. Как всё сложно. Я ограничился одной строкой:
Код:
# Всех посылаем на url_manager.php
RewriteRule ^([\s\S]+)$ url_manager.php?file_real_requested=$1 [QSA,L] # Редирект на главный обработчик
И пока никаких проблем не было.
Ответить с цитированием
  #19 (permalink)  
Старый 08.06.2012, 20:54
что-то знаю
Отправить личное сообщение для devote Посмотреть профиль Найти все сообщения от devote
 
Регистрация: 24.05.2009
Сообщений: 5,176

observer,
да что у вас совсем перебор в .htaccess, зачем столько лишних действий не понимаю.

Сообщение от Раед
И пока никаких проблем не было.
и правильно, зачем кавардак устраивать в .htaccess
__________________
хм Russians say завтра but завтра doesn't mean "tomorrow" it just means "not today."
HTML5 history API рассширение для браузеров не поддерживающих pushState, replaceState
QSA CSS3 Selector Engine
Ответить с цитированием
Ответ



Опции темы Искать в теме
Искать в теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
По клику передать параметры в пхп и вывести картинку nikki4 Элементы интерфейса 2 04.04.2012 12:20
Передать произвольные параметры системы? nullov Javascript под браузер 0 19.04.2011 03:17
Как передать параметры из дочернего окна в родительское с задержкой? javascript_pupil Общие вопросы Javascript 15 23.11.2010 21:42
Запустить скрыто батник и передать ему параметры Рома3 Общие вопросы Javascript 2 18.10.2010 23:17
Может ли скрипт передать на сервер параметры окна :\ ForumReader Internet Explorer 5 21.07.2010 03:34