Javascript-форум (https://javascript.ru/forum/)
-   Серверные языки и технологии (https://javascript.ru/forum/server/)
-   -   htaccess mod_rewrite RewriteRule - передать get параметры (https://javascript.ru/forum/server/28877-htaccess-mod_rewrite-rewriterule-peredat-get-parametry.html)

Раед 06.06.2012 00:24

А что лучше разбирать, REQUEST_URI или REDIRECT_URL

devote 06.06.2012 00:28

вот мой вариант на всех сайтах:
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!" );
}
но мне этого делать не приходится.

devote 06.06.2012 00:28

Цитата:

Сообщение от Раед
А что лучше разбирать, REQUEST_URI или REDIRECT_URL

REQUEST_URI конечно, ибо REDIRECT_URL не всегда определен

Раед 06.06.2012 00:47

Цитата:

Сообщение от devote
REQUEST_URI конечно, ибо REDIRECT_URL не всегда определен

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

Цитата:

Сообщение от devote
вот мой вариант на всех сайтах

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

Цитата:

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

Это же почти все php файлы в массив класть придётся. Или я опять что-то не понял?

devote 06.06.2012 00:53

Цитата:

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

его определяет apache тоесть если в .htaccess он наткнулся на правило и сделал редирект, то он его определяет. При отсутствии правил в .htaccess это переменная будет не определена.

Раед 08.06.2012 00:25

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

Это нормально?

observer 08.06.2012 19:54

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

Вам нужна переменная окружения 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);

Все. В массиве у вас все кусочки пути. Дальше уже включается в работу логика приложения.

Раед 08.06.2012 20:02

Цитата:

Сообщение от observer
Ваш .htaccess может выглядеть так

Эээ. Как всё сложно. Я ограничился одной строкой:
Код:

# Всех посылаем на url_manager.php
RewriteRule ^([\s\S]+)$ url_manager.php?file_real_requested=$1 [QSA,L] # Редирект на главный обработчик

И пока никаких проблем не было.

devote 08.06.2012 20:54

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

Цитата:

Сообщение от Раед
И пока никаких проблем не было.

и правильно, зачем кавардак устраивать в .htaccess


Часовой пояс GMT +3, время: 16:46.