.htaccess
htaccess (с точкой в начале имени) – это файл, который дает возможность конфигурировать работу сервера в отдельных директориях (папках), не предоставляя доступа к главному конфигурационному файлу. Например, устанавливать права доступа к файлам в директории, менять названия индексных файлов, самостоятельно обрабатывать ошибки Apache, перенаправляя посетителей на специальные страницы ошибок.
Как известно, конфигурационные директивы сервера Apache находятся в файлe httpd.conf. Но далеко не всегда у Вас будут права доступа к этому файлу. Например, если Вы используете для хостинга виртуальный сервер, когда один сервер Apache обслуживает множество сайтов, то, естественно, Вам никто не позволит менять его конфигурацию. Но, тем не менее, вы можете конфигурировать работу сервера в своих директориях. И делать вы это можете с помощью файлов .htaccess.
Файл .htaccess может быть размещен в любом каталоге. Директивы этого файла действует на все файлы в текущем каталоге и во всех его подкаталогах (если эти директивы не переопределены директивами нижележащих файлов .htaccess).
Изменения, вносимые в файлы .htaccess, вступают в силу немедленно и не требуют перезагрузки сервера, в отличие от изменений, вносимых в главный конфигурационный файл httpd.conf.
Настройки httpd.conf, разрешающие применение файлов .htaccess
Для того, что бы эти файлы .htaccess можно было использовать — необходимы соответствующие настройки главного конфигурационного файла. В файле httpd.conf должны быть прописаны директивы, которые разрешат файлу .htaccess переопределять конфигурацию web-сервера в каталоге. Эта директива называется AllowOverride. Она может быть установлена как для всего сервера (глобально), так и для отдельного каталога.
Директива AllowOverride может включать в себя одну из следующих директив или их комбинацию: All, None, AuthConfig, FileInfo, Indexes, Limit, Options.
Для того чтобы дать директивам файлов .htaccess максимальные права следует прописать в httpd.conf:
AllowOverride All
Примечание
При желании название конфигурационного файла можно изменить, и например, назвать его не .htaccess, a access.conf. За название этого файла отвечает директива AccessFileName в файле httpd.conf. Но все же рекомендуется этого не делать.
Синтаксис .htaccess
Перед тем, как будут рассмотрены примеры, остановимся на синтаксисе директив в файлах .htaccess.
Пути к файлам и директориям должны указываться от корня сервера, например, /pub/home/server1/html/
Если вы не знаете путь от корня сервера, то Вы можете его узнать, спросив у администратора сервера, либо можете посмотреть сами, запустив на сайте функцию PHP — phpinfo(). Она выведет на экран конфигурацию PHP в виде фиолетовых таблиц. В них Вам необходимо найти переменную doc_root и посмотреть ее значение — это будет путь от корня сервера до Вашей основной директории.
- В именах доменов обязательно должны быть указаны протоколы, например:
Redirect / http://www.newsite.ru
Примеры использования .htaccess
Глобальное перенаправление (редирект) на другой адрес:
Redirect / http://www.newsite.ru
Перенаправление (редирект) только при запросе определенных страниц:
redirect /company http://www.newsite.com/newcompany redirect /forum http://www.newsite.com/newforum
При запросе страниц из каталогов company и forum будет произведено перенаправление на новые адреса.
Перенаправление (редирект) только посетителей с определенным IP-адресом:
SetEnvIf REMOTE_ADDR 192.145.121.1 REDIR="redir" RewriteCond %{REDIR} redir RewriteRule ^/$ /only_for_you.html
Если посетитель имеет IP-адрес 192.145.121.1, то ему будет открыта страница only_for_you.html.
Изменение названия индексной страницы:
DirectoryIndex index.html index.php index.shtml
Можно указать несколько индексных страниц. При запросе каталога они будут искаться в том порядке, в котором перечислены в директиве DirectoryIndex. Если не будет найден файл index.html, то будет произведен поиск файла index.php и т.д.
Выполнять код PHP в файлах HTML
RemoveHandler .html .htm AddType application/x-httpd-php .php .htm .html .phtml
Добавив эти строки в .htaccess вы дадите директиву серверу выполнять инструкции PHP не только в файлах с расширением *.php и *.phtml, но и в файлах с расширением *.htm и *.html.
Обработка ошибок Apache
ErrorDocument 401 /401.html ErrorDocument 403 /403.html ErrorDocument 404 /404.html ErrorDocument 500 /500.html
При возникновении этих ошибок посетитель будет перенаправлен на специально созданные страницы.
401 ошибка — Требуется авторизация (Authorization Required).
403 ошибка — пользователь не прошел аутентификацию, доступ запрещен (Forbided).
404 ошибка — Документ не найден (Not Found).
500 ошибка — Внутренняя ошибка сервера (Internal Server Error).
Запрет на отображение содержимого каталога при отсутствии индексного файла
Options –Indexes
Определение кодировки, в которой сервер «отдает» файлы
AddDefaultCharset windows-1251
Определение кодировки на загружаемые файлы
CharsetSourceEnc windows-1251
Запрет доступа ко всем файлам
deny from all
Запрещен доступ ко всем файлам и каталогам в текущей директории.
Разрешить доступ только с определенного IP-адреса
order deny,allow deny from all allow from 195.135.232.70
Строка order deny,allow определяет, в каком порядке следует выполнять директивы. Сначала выполняется директива запрета доступа, а затем разрешается доступ только для IP-адреса 195.135.232.70. Если в первой строке поменять порядок следования директив на order allow,deny, то доступ для данного IP-адреса не будет открыт, так как директива deny, выполняемая последней перекроет действия директивы allow.
Запретить доступ с определенного IP-адреса
deny from 195.135.232.70
Запретить доступ к определенному файлу
<Files config.php> deny from all </Files>
Запрещен доступ посетителей к файлам config.php. Этот запрет не действует на скрипты web-сервера. Они по прежнему будут иметь доступ к этому файлу.
Запретить доступ к файлам с определенным расширением
<Files "*.conf"> deny from all </Files>
Здесь запрещен доступ к файлам с расширением *.conf. Директива , при указании имени файлов, позволяет использовать подстановочные символы.
? — любой одиночный символ
* — любая последовательность символов, исключая символ / (слеш)
Запретить доступа к файлам с несколькими типа расширений
<Files ~ "\.(inc|conf|cfg)$"> deny from all </Files>
Запрещен доступ к файлам с расширением *.inc, *.conf и *.cfg. Хотя директива , по умолчанию, не работает с регулярными выражениями, но их можно включить поставив символ тильды(~) в опциях директивы. Синтаксис следующий:
[тильда] [пробел] [далее_все_без_пробелов]
Установка пароля на директорию
<Files> AuthName "Admin page" AuthType Basic AuthUserFile /pub/home/server/.pass require valid-user </Files>
- Перенаправление с www на http://
- RewriteEngine On
- RewriteCond %{HTTP_HOST} ^www\.(.+) [NC]
- RewriteRule ^(.*) http://%1/$1 [R=301,NE,L]
- Обработка ошибки 404 файл не найден
- ErrorDocument 404 /404.html
- Динамически создаваемые странички
- RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)$ /index.php?id=$1 [NC,L,QSA]
$_SERVER
$HTTP_SERVER_VARS [удалено]
(PHP 4 >= 4.1.0, PHP 5)
$_SERVER — $HTTP_SERVER_VARS [удалено] — Информация о сервере и среде исполнения
Описание
Переменная $_SERVER — это массив, содержащий информацию, такую как заголовки, пути и местоположения скриптов. Записи в этом массиве создаются веб-сервером. Нет гарантии, что каждый веб-сервер предоставит любую из них; сервер может опустить некоторые из них или предоставить другие, не указанные здесь. Тем не менее, многие эти переменные присутствуют в » спецификации CGI/1.1, так что вы можете их ожидать их реализации и в конкретном веб-сервере.
Переменная $HTTP_SERVER_VARS содержит ту же начальную информацию, но она не суперглобальная. (Заметьте, что$HTTP_SERVER_VARS и $_SERVER являются разными переменными, так что PHP обрабатывает их соответственно). Также учтите, что «длинные массивы» были удалены в версии PHP 5.4.0, поэтому $HTTP_SERVER_VARS больше не существует.
Индексы
Вы можете найти (а можете и не найти) любой из следующих элементов в массиве $_SERVER. Заметьте, что немногие элементы, если вобще такие найдутся, будут доступны (или действительно будут иметь значение), если PHP запущен в командной строке.
‘PHP_SELF’
Имя файла скрипта, который сейчас выполняется, относительно корня документов. Например,$_SERVER[‘PHP_SELF’] в скрипте по адресу http://example.com/foo/bar.php будет /foo/bar.php. Константа __FILE__ содержит полный путь и имя файла текущего (то есть подключенного) файла. Если PHP запущен в командной строке, эта переменная содержит имя скрипта, начиная с PHP 4.3.0. Раньше она была недоступна.
‘argv‘
Массив агрументов, переданных скрипту. Когда скрипт запущен в командой строке, это дает C-подобный доступ к параметрам командной строки. Когда вызывается через метод GET, этот массив будет содержать строку запроса.
‘argc‘
Содержит количество параметров, переданных скрипту (если запуск произведен в командной строке).
‘GATEWAY_INTERFACE’
Содержит используемую сервером версию спецификации CGI; к примеру’CGI/1.1‘.
‘SERVER_ADDR’
IP адрес сервера, на котором выполняется текущий скрипт.
‘SERVER_NAME’
Имя хоста, на котором выполняется текущий скрипт. Если скрипт выполняется на виртуальном хосте, здесь будет содержатся имя, определенное для этого виртуального хоста.
‘SERVER_SOFTWARE’
Строка идентификации сервера, указанная в заголовках, когда происходит ответ на запрос.
‘SERVER_PROTOCOL’
Имя и версия информационного протокола, через который была запрошена страница; к примеру ‘HTTP/1.0‘;
‘REQUEST_METHOD’
Какой метод был использован для запроса страницы; к примеру ‘GET‘, ‘HEAD‘, ‘POST‘, ‘PUT‘.
Замечание:
PHP скрипт завершается после посылки заголовков (тоесть после того, как осуществляет любой вывод без буферизации вывода), если запрос был осуществлен методом HEAD.
‘REQUEST_TIME’
Временная метка начала запроса. Доступна, начиная с PHP 5.1.0.
‘REQUEST_TIME_FLOAT’
Временная метка начала запроса с точностью до микросекунд. Доступна, начиная с PHP 5.4.0.
‘QUERY_STRING’
Строка запросов, если есть, с помощью которой была получена страница.
‘DOCUMENT_ROOT’
Директория корня документов, в которой выполняется текущий скрипт, в точности та, которая указана в конфигурационном файле сервера.
‘HTTP_ACCEPT’
Содержимое заголовка Accept: из текущего запроса, если он есть.
‘HTTP_ACCEPT_CHARSET’
Содержимое заголовка Accept-Charset: из текущего запроса, если он есть. Например: ‘iso-8859-1,*,utf-8‘.
‘HTTP_ACCEPT_ENCODING’
Содержимое заголовка Accept-Encoding: из текущего запроса, если он есть. Например: ‘gzip‘.
‘HTTP_ACCEPT_LANGUAGE’
Содержимое заголовка Accept-Language: из текущего запроса, если он есть. Например: ‘en‘.
‘HTTP_CONNECTION’
Содержимое заголовка Connection: из текущего запроса, если он есть. Например: ‘Keep-Alive‘.
‘HTTP_HOST’
Содержимое заголовка Host: из текущего запроса, если он есть.
‘HTTP_REFERER’
Адрес страницы (если есть), которая привела браузер пользователя на эту страницу. Этот заголовок устанавливается веб-браузером пользователя. Не все браузеры устанавливают его и некоторые в качестве дополнительной возможности позволяют изменять содержимое заголовка HTTP_REFERER. Одним словом, в самом деле ему нельзя доверять.
‘HTTP_USER_AGENT’
Содержимое заголовка User-Agent: из текущего запроса, если он есть. Эта строка содержит обозначение браузера, которым пользователь запросил данную страницу. Типичным примером является строка: Mozilla/4.5 [en] (X11; U; Linux 2.2.9 i586). Среди прочего, вы можете использовать это значение с функцией get_browser() чтобы адаптировать вывод вашей страницы к возможностям браузера пользователя
‘HTTPS’
Принимает непустое значение, если запрос был произведен через протокол HTTPS.
Замечание: Обратите внимание, что при использовании ISAPI с IIS значение будет off, если запрос не был произведен через протокол HTTPS.
‘REMOTE_ADDR’
IP-адрес, с которого пользователь просматривает текущую страницу.
‘REMOTE_HOST’
Удаленный хост, с которого пользователь просматривает текущую страницу. Обратный просмотр DNS базируется на значении переменной REMOTE_ADDR.
Замечание: Ваш веб-сервер должен быть настроен, чтобы создавать эту переменную. Для примера, в Apache вам необходимо присутствие директивы HostnameLookups On в файле httpd.conf, чтобы эта переменная создавалась. См. такжеgethostbyaddr().
‘REMOTE_PORT’
Порт на удаленной машине, который используется для связи с веб-сервером.
‘REMOTE_USER’
Аутентифицированный пользователь.
‘REDIRECT_REMOTE_USER’
Аутентифицированный пользователь, если запрос был перенаправлен изнутри.
‘SCRIPT_FILENAME’
Абсолютный путь к скрипту, который в данный момент исполняется.
Замечание:
Если скрипт запускается в коммандной строке (CLI), используя относительный путь, такой как file.php или ../file.php, переменная $_SERVER[‘SCRIPT_FILENAME’] будет содержать относительный путь, указанный пользователем.
‘SERVER_ADMIN’
Эта переменная получает свое значение (для Apache) из директивы конфигурационного файла сервера. Если скрипт запущен на виртуальном хосте, это будет значение, определенное для данного виртуального хоста.
‘SERVER_PORT’
Порт на компьютере сервера, используемый веб-сервером для соединения. Для установок по умолчанию, значение будет ‘80‘; используя SLL, например, это значение будет таким, какое сконфигурировано для соединений безопасного HTTP.
Замечание: Чтобы получить физический (реальный) порт в Apache 2, необходимо установить UseCanonicalName = On иUseCanonicalPhysicalPort = On, иначе это значение может быть подменено и не вернуть реальной значение физического порта. Полагаться на это значение небезопасно в контексте приложений, требующих усиленной безопасности.
‘SERVER_SIGNATURE’
Строка, содержащая версию сервера и имя виртуального хоста, которые добавляются к генерируемым сервером страницам, если включено.
‘PATH_TRANSLATED’
Filesystem- (not document root-) based path to the current script, after the server has done any virtual-to-real mapping.
Замечание: Начиная с PHP 4.3.2, переменная PATH_TRANSLATED больше не устанавливается неявно в Apache 2 SAPI, по сравнению с Apache версии 1, где она устанавливается в то же самое значение, что и переменная SCRIPT_FILENAME, когда она не используется Apache. Это изменение было сделано для соответствия спецификации CGI, где переменнаяPATH_TRANSLATED должна существовать только тогда, когда PATH_INFO определена. Пользователи Apache 2 могут использовать директиву AcceptPathInfo = On в конфигурационном файле httpd.conf для задания переменной PATH_INFO.
‘SCRIPT_NAME’
Содержит путь, к текущему исполняемому скрипту. Это полезно для страниц, которые должны указывать на самих себя. Константа __FILE__ содержит полный путь и имя текущего (т.е. включаемого) файла.
‘REQUEST_URI’
URI, который был передан для того, чтобы получить доступ к этой странице. Например, ‘/index.html‘.
‘PHP_AUTH_DIGEST’
При выполнении HTTP Digest аутентификации, этой переменной присваивается заголовок ‘Authorization’, который присылается клиентом (его необходимо потом использовать для соответствующей валидации).
‘PHP_AUTH_USER’
Когда выполняется HTTP-аутентификация, этой переменной присваивается имя пользователя, предоставленное пользователем.
‘PHP_AUTH_PW’
Когда выполняется HTTP-аутентификация, этой переменной присваивается пароль, предоставленный пользователем.
‘AUTH_TYPE’
Когда выполняется HTTP-аутентификация, этой переменной присваивается тип аутентификации, который используется.
‘PATH_INFO’
Содержит любой предоставленный пользователем путь, содержащийся после имени скрипта, но до строки запроса, если доступно. Например, если текущий скрипт запрошен по URL http://www.example.com/php/path_info.php/some/stuff?foo=bar, то переменная $_SERVER[‘PATH_INFO’] будет содержать /some/stuff.
‘ORIG_PATH_INFO’
Исходное значение переменной ‘PATH_INFO’ до начала обработки PHP.
Список изменений ¶
Версия | Описание |
5.4.0 | Массив $HTTP_SERVER_VARS больше не доступен в связи с удалением «длинных массивов». |
5.3.0 | Директива register_long_arrays, которая приводила к заполнению $HTTP_SERVER_VARS помечена как устаревшая. |
4.1.0 | Введена переменная $_SERVER вместо старой $HTTP_SERVER_VARS. |
Примеры ¶
Пример #1 Пример использования $_SERVER
<?php echo $_SERVER['SERVER_NAME']; ?>
Результатом выполнения данного примера будет что-то подобное:
www.example.com
Примечания
Замечание:
Это ‘суперглобальная’ или автоматическая глобальная переменная. Это просто означает что она доступна во всех контекстах скрипта. Нет необходимости выполнять global $variable; для доступа к ней внутри метода или функции.
Смотрите также
Для проверки правильных настроек сжатия и кэширования используйте
https://developers.google.com/speed/pagespeed/insights/?url=ipage.com&tab=mobile
Включаем сжатие
<IfModule mod_deflate.c> #The following line is enough for .js and .css AddOutputFilter DEFLATE js css AddOutputFilterByType DEFLATE text/plain text/xml application/xhtml+xml text/css application/xml application/rss+xml application/atom_xml application/x-javascript application/x-httpd-php application/x-httpd-fastphp text/html #The following lines are to avoid bugs with some browsers BrowserMatch ^Mozilla/4 gzip-only-text/html BrowserMatch ^Mozilla/4\.0[678] no-gzip BrowserMatch \bMSIE !no-gzip !gzip-only-text/html </IfModule>
Настраиваем и включаем кэширование.
ExpiresActive On
ExpiresDefault A0
# 1 YEAR - doesn't change often <FilesMatch "\.(flv|ico|pdf|avi|mov|ppt|doc|mp3|wmv|wav)$"> ExpiresDefault A31536000 </FilesMatch>
# 1 WEEK - possible to be changed, unlikely <FilesMatch "\.(jpg|jpeg|png|gif|swf)$"> ExpiresDefault A604800 </FilesMatch>
# 3 HOUR - core content, changes quickly <FilesMatch "\.(txt|xml|js|css)$"> ExpiresDefault A10800 </FilesMatch>
<? mysql_connect("localhost","root","");//соединились с базой данных mysql_select_db("users");//выбрали базу данных с которой будем работать $param=explode("/",$_GET['id']); echo "<meta charset='utf-8'>"; if($param[2]>0)//выводим статью { $table=mysql_query( "select * from posts where `id`='{$param[2]}'"); while($r=mysql_fetch_array($table)) { $text=str_replace("<"," <",$r['text']); $text=strip_tags($text); mb_internal_encoding("utf-8"); $text=mb_substr($text,0,100); $text=trim($text); $text=str_replace(" ","-",$text); $text=str_replace("--","-",$text); $text=str_replace("--","-",$text); $text=str_replace("--","-",$text); echo " <img src='http://alexey/images/{$r['img']}' height='300px'>"; echo "<div style='height:155px;overflow:hidden;text-overflow:ellipsis;'>{$r['text']}</div>"; } }//выводим категорию else { echo "<h1>Вы находитесь в категории ".$_GET['id'].".</h1><hr>"; $table=mysql_query( "select * from posts where `h1`='{$_GET['id']}'"); while($r=mysql_fetch_array($table)) { $text=str_replace("<"," <",$r['text']); $text=strip_tags($text); mb_internal_encoding("utf-8"); $text=mb_substr($text,0,100); $text=trim($text); $text=str_replace(" ","-",$text); $text=str_replace("--","-",$text); $text=str_replace("--","-",$text); $text=str_replace("--","-",$text); echo "<a href='http:/{$_GET['id']}/{$text}/{$r['id']}'><img src='../images/{$r['img']}' height='300px'>"; echo "<div style='height:155px;overflow:hidden;text-overflow:ellipsis;'>{$r['text']}</div><hr><br><br>"; } } ?>