How to remove .php, .html, .htm extensions with .htaccess
I recently wanted to remove the extensions from my website, in order to make the URLs more user and search engine friendly. I stumbled across tutorials on how to remove the .php extension from a PHP page. What about the .html ? I wanted to remove those as well! In this tutorial I’ll show you how to do that easily, by editing the .htaccess file.
What is an .htaccess file
An .htaccess file is a simple ASCII file that you create with a text editor like Notepad or TextEdit. The file lets the server know what configuration changes to make on a per-directory basis.
Please note that .htaccess is the full name of the file. It isn’t file.htaccess , it’s simply .htaccess .
.htaccess files affect the directory in which they are placed in and all children (sub-directories). For example if there is one .htaccess file located in your root directory of yoursite.com , it would affect yoursite.com/content/ , yoursite.com/content/images/ , and so on…
It is important to remember that this can be bypassed. If you don’t want certain .htaccess commands to affect a specific directory, place a new .htaccess file within the directory you don’t want to be affected with the changes, and remove the specific command(s) from the new file.
Features
With an .htaccess file you can:
- Redirect the user to different page
- Password protect a specific directory
- Block users by IP
- Preventing hot-linking of your images
- Rewrite URLs
- Specify your own Error Documents
In this tutorial we’ll be focusing only on rewriting URLs.
Removing Extensions
To remove the .php extension from a PHP file for example yoursite.com/wallpaper.php to yoursite.com/wallpaper you have to add the following code inside the .htaccess file:
RewriteEngine On RewriteCond % !-f RewriteRule ^([^\.]+)$ $1.php [NC,L]
If you want to remove the .html extension from a html file for example yoursite.com/wallpaper.html to yoursite.com/wallpaper you simply have to change the last line from the code above, to match the filename:
RewriteRule ^([^\.]+)$ $1.html [NC,L]
That’s it! You can now link pages inside the HTML document without needing to add the extension of the page. For example:
Adding a trailing slash at the end
I received many requests asking how to add a trailing slash at the end, for example: yoursite.com/page/
Ignore the first snippet and insert the code below. The first four lines deal with the removal of the extension and the following, with the addition of the trailing slash and redirecting.
RewriteEngine On RewriteCond % !-f RewriteRule ^([^/]+)/$ $1.php RewriteRule ^([^/]+)/([^/]+)/$ /$1/$2.php RewriteCond % !-f RewriteCond % !-d RewriteCond % !(\.[a-zA-Z0-9]|/)$ RewriteRule (.*)$ /$1/ [R=301,L]
Link to the HTML or PHP file the same way as shown above. Don’t forget to change the code if you want it applied to an HTML file instead of PHP.
Some people asked how you can remove the extension from both HTML and PHP files. I don’t have a solution for that. But, you could just change the extension of your HTML file from .html or .htm to .php and add the code for removing the .php extension.
Conclusion
For those who are not so experienced with .htaccess files there is an online tool for creating them. It’s useful for novice users to get started, and easy to use.
Updates
Attention GoDaddy users: In order to remove the extensions you need to enable MultiViews before. The code should look like this:
Options +MultiViews RewriteEngine On RewriteCond % !-d RewriteCond % !-f RewriteRule ^([^\.]+)$ $1.php [NC,L]
If you’re worried that search engines might index these pages as duplicate content, add a meta tag in the of your HTML file:
Включить выполнение PHP кода в .html файлах

На многих хостингах по умолчанию отключено выполнение PHP скриптов в файлах .html, .htm, .tpl. Чтобы это исправить достаточно добавить директиву AddType application/x-httpd-php в файл .htaccess в корне сайта или директории с нужными файлами.
AddType application/x-httpd-php .php .htm .html .tpl
Или:
AddType application/x-httpd-php .php AddType application/x-httpd-php .htm AddType application/x-httpd-php .html AddType application/x-httpd-php .tpl
Метод с AddHandler:
AddHandler application/x-httpd-php .php .htm .html .tpl
Метод с SetHandler:
SetHandler application/x-httpd-php
.htaccess PHP
.htaccess (с точкой в начале имени) — это файл-конфигуратор Apache-серверов, который дает возможность конфигурировать работу сервера в отдельных директориях (папках), не предоставляя доступа к главному конфигурационному файлу (apache/conf/httpd.conf). Например, устанавливать права доступа к файлам в директории, менять названия индексных файлов, самостоятельно обрабатывать ошибки Apache, перенаправляя посетителей на специальные страницы ошибок. .htaccess представляет собой обычный текстовый документ, расширение которого htaccess. Данный файл обычно находится в корне сайта, однако Вы можете создавать и дополнительные .htaccess-файлы для различных директорий Вашего сайта.
Mod_rewrite — модуль, используемый веб-серверами для преобразования URL’ов.
Если вы хотите вести логи всех операций, выполненных с помощью mod_rewrite, можно активировать это с помощью следующей записи в httpd.conf:
RewriteLog /usr/local/apache/logs/mod_rewrite.log RewriteLogLevel 1
Директивы модуля Mod_rewrite
Наиболее часто используемые параметры
%
% Доменное имя, например «max22.ru»
% Строка GET параметров
Варианты реализации Редиректа с помощью файла .htaccess
- Простой редирект:
Redirect 301 / http://www.domainname.ru/
redirect /secret http://www.site.ru/nosecret
# с использованием регулярного выражения RedirectMatch 301 .* http://www.site.ru/?from=htmlweb.ru
SetEnvIf REMOTE_ADDR 192.152.37.125 REDIR="redir" RewriteCond % redir RewriteRule ^/$ /user.php
RewriteEngine On RewriteRule !.(gif|jpg)$ index.php
Options +FollowSymLinks RewriteEngine on RewriteCond % ^yourdomain\.ru RewriteRule ^(.*)$ http://www.yourdomain.ru/$1 [R=permanent,L]
RedirectMatch 301 (.*) http://www.yourdomain.ru$1 Прописывается в файле .htaccess.
(.*) RedirectMatch фактически соответствует регулярным образцам выражения после доменного имени. Таким образом, нельзя выполнить соответствие образца на ^/yourdomain.ru. Однако, можно преобразовать страницы с использованием .html расширения к файлам того же самого названия, но с .php расширением:
RedirectMatch 301 (.*)\.html$ http://www.yourdomain.ru$1.php
Если необходимо сделать различное перенаправление для отдельных страниц, можно использовать следующее:
RedirectMatch Permanent ^/html/resources.html$ http://www.newdomain.com/resources.php RedirectMatch Permanent ^/html/other_page.html$ http://www.newdomain.com/other_page.php RedirectMatch Permanent ^/(.*)$ http://www.newdomain.com/
RewriteEngine on RewriteRule ^product/([^/\.]+)/?$ product.php?id=$1 [L]
В следующем примере преобразуем www.site.ru/script.php?product=123 в www.site.ru/cat/product/123/:
RewriteRule cat/(.*)/(.*)/$ /script.php?$1=$2
header("HTTP/1.1 301 Moved Permanently"); header("Location: http://www.newdomain.ru/newdir/newpage.htm"); exit();
RewriteRule ^superdiscount(.*)$ /hot-offers.php [L,R=301]
RewriteRule ^superdiscount/my-ebook.html /hot-to-make-million.html [L,R=301] RewriteRule ^superdiscount(.*)$ /hot-offers.php [L,R=301]
RewriteRule ^article.jsp?id=(.*)$ /latestnews.htm [L,R=301]
RewriteRule ^/product-(.*)_([0-9]+).php /redirectold.php?productid=$2
затем создаем PHP файл redirectold.php, который будет поддерживать 301 редирект:
else < while($row = mysql_fetch_array($result)) < $ret = 'http://www.yoursite.com/'. $row["new_url"]; >> mysql_close($s); return $ret; > $productid = $_GET["productid"]; $url = getRedirectUrl($productid); header("HTTP/1.1 301 Moved Permanently"); header("Location: $url"); exit(); ?>
RewriteEngine on # оглашаем, что хотим использовать mod_rewrite RewriteCond % ^www\.(.*) [NC] RewriteRule ^/?(.*) http://%1/$1 [L,R=permanent]
RewriteCond % ^.*/index.php RewriteRule ^(.*)index.php$ http://%/$1 [R=301,L]
AddHandler application/x-httpd-php .html
Этот прием можно использовать и для других расширений файлов:
AddHandler application/x-httpd-php .xml AddHandler application/x-httpd-php .asp
Редиректы в зависимости от времени
Когда нужно применять уловки типа содержания, зависящего от времени, масса вебмастеров все ещё используют CGI скрипты, которые производят редиректы на специальные страницы. Как это может быть сделано через mod_rewrite?
Есть много переменных названных TIME_xxx для условий редиректа. В связке со специальными лексикографическими образцами для сравнения STRING и =STRING мы можем производить редиректы, зависящие от времени:
RewriteEngine on RewriteCond %% >0700 RewriteCond %%Это выдает содержимое foo.day.html при запросе URL foo.html с 07:00 до 19:00 а в оставшееся время содержимое foo.night.html.
Запрещение доступа в конкретную директорию
- для всех ко всем файлам в директории:
deny from alldeny from all order deny,allow deny from all allow from 192.152.37.125Доступ в данную директорию будет разрешён только пользователю с ip 192.152.37.125. А если хотите наоборот, запретить отдельным ip пользователям доступ к вашему сайту, то пропишем следующие строчки:
order allow,deny allow from all deny from 192.152.37.125 deny from 123.456.177Options -Indexesdeny from all Запрещен доступ к файлам с расширением *.inc, *.conf и *.cfg. Хотя директива, по умолчанию, не работает с регулярными выражениями, но их можно включить поставив символ тильды(~) в опциях директивы. Синтаксис следующий: [тильда] [пробел] [далее_все_без_пробелов] Чтобы блокировать этот доступ, запишем следующее:
RewriteRule ^.htaccess$ - [F]Определение кодировки
Определение кодировки, в которой сервер "отдает" файлы
AddDefaultCharset windows-1251варианты: KOI8-R, UTF-8, Windows-1251
Определение кодировки на загружаемые файлы
CharsetSourceEnc windows-1251Установка пароля на директорию с помощью .htaccess
Для установки пароля на директорию можно воспользоваться системой базовой авторизации, предусмотренной в веб-сервере Apache. Создаем в каталоге, к которому хотим ограничить доступ по паролю, файл .htaccess с такими директивами:
AuthType Basic AuthName "Some Name" AuthUserFile /www/some_login/www/htdocs/some_dir/.htpasswd require valid-userПуть /www/some_login/www/htdocs/some_dir/.htpasswd обозначает полный путь к файлу паролей на диске нашего сервера. Если, например, вы поместите файл .htpasswd (в нем будут пароли) в домашний каталог, куда вы попадаете, зайдя на сервер по FTP, то путь к этому файлу будет иметь вид /www/some_login/www/htdocs/some_dir/.htpasswd, где some_login - Ваш логин.
В директиве AuthUserFile указываем абсолютный путь к файлу с логинами/паролями, который мы создадим чуть позже. Если вы создаете файл .htaccess на своем компьютере, а не сразу на сервере используя текстовый редактор, обратите особое внимание на то, что .htaccess должен передаваться по FTP строго в текстовом (ASCII) режиме.
Создаем файл паролей. Файл с паролями должен содержать строки вида login:password. Пароль должен быть зашифрован с использованием алгоритма MD5. Один из способов создать такой файл - воспользоваться программой, входящей в поставку Apache - htpasswd (на нашем сервере она находится в каталоге /usr/local/apache/bin, полный путь - /usr/local/apache/bin/htpasswd).
Рассмотрим, как создать файл паролей в unix shell прямо на сервере. Зайдем в shell и будем выполнять следующие команды:
htpasswd -mbc .htpasswd user1 7B1safkir- создаем новый файл .htpasswd, в который добавляем запись для пользователя user1 с паролем, указанным в командной строке.
htpasswd .htpasswd user2- добавляем в уже существующий файл .htpasswd пользователя user2, а пароль вводим вручную в ответ на соответствующий запрос программы.
После окончания заведения всех логинов файл нужно загрузить на сервер.
Задаем собственные страницы ошибок
Задать собственную страницу ошибок можно следующим образом:
ErrorDocument 404 http://www.site.ru/404.phpIE игнорирует страницы размером меньше 512 байт.
Индексация директорий и поддиректорий
Чтобы избежать индексации поисковыми системами директорий и поддиректорий, необходимо прописать такую строку, к примеру:
DirectoryIndex index.phpЭта директива задает файл, который будет вызван при обращении к директории без указания имени файла.
Можно указать несколько индексных страниц. При запросе каталога они будут искаться в том порядке, в котором перечислены в директиве DirectoryIndex. Если не будет найден файл index.html, то будет произведен поиск файла index.php и т.д.
DirectoryIndex index.html index.php index.shtmlЛично я предпочитаю переадресовывать с пустых директорий либо на главную страницу сайта, либо на какую-либо другую подходящую страницу. Например, директорию www.site.ru/pic/ можно переадресовать на www.site.ru.
Защита изображений от скачивания
Очень часто бывает, что веб-мастера нагло копируют контент с Вашего сайта вместе с рисунками, причем рисунки подгружаются с Вашего же сервера. Это создает лишний трафик, что, зачастую, приводит к ряду проблем. Как же защититься от таких веб-мастеров и не помешать поисковым роботам индексировать изображения? Все просто:
RewriteEngine on RewriteCond % . RewriteCond % !^http://([^.]+\.)?site\. [NC] RewriteCond % !google\. [NC] RewriteCond % !search\?q=cache [NC] RewriteCond % !msn\. [NC] RewriteCond % !yahoo\. [NC] RewriteCond % !^/hotlinker\.gif$ RewriteRule \.(gif|jpg|png)$ /hotlinker.gif [NC,L]hotlinker.gif - изображение, которое будет отображаться, вместо истинных изображений. Рекомендую в этом изображении отобразить Ваш логотип и ссылку на Ваш сайт.
Еще один варинат запрета доступа к картинкам с неразрешенных сайтов:
SetEnvIfNoCase Referer "^$" local_ref=1 SetEnvIfNoCase Referer "^http://(www\.)?htmlweb\.ru" local_ref=1 SetEnvIfNoCase Referer "^http://(www\.)?images\.yandex\.ru" local_ref=1 SetEnvIfNoCase Referer "^http://(www\.)?hghltd\.yandex\.com" local_ref=1Order Allow,Deny Allow from env=local_ref Поисковые машини и разного рода сканеры создают коллосальный трафик на вашем сайте. Нижеприведенный блок кода позволит запретить доступ ботам на сайт.
RewriteCond % (Googlebot|Slurp|spider|Twiceler|heritrix| Combine|appie|boitho|e-SocietyRobot|Exabot|Nutch|OmniExplorer| MJ12bot|ZyBorg/1|Ask\ Jeeves|AskJeeves|ActiveTouristBot| JemmaTheTourist| agadine3|BecomeBot|Clustered-Search-Bot| MSIECrawler|freefind|galaxy|genieknows|INGRID|grub-client| MojeekBot|NaverBot|NetNose-Crawler|OnetSzukaj|PrassoSunner| Asterias\ Crawler|T-H-U-N-D-E-R-S-T-O-N-E|GeorgeTheTouristBot| VoilaBot|Vagabondo|fantomBro wser|stealthBrowser|cloakBrowser| fantomCrew\ Browser|Girafabot|Indy\ Library|Intelliseek|Zealbot| Windows\ 95|^Mozilla/4\.05\ \[en\]$|^Mozilla/4\.0$) [NC] RewriteRule ^(.*)$ - [F] # RewriteCond % ^Mozilla.* [NC,OR] RewriteCond % ^Opera.* [NC,OR] RewriteCond % ^Firefox.* [NC,OR] RewriteCond % ^Netscape.* [NC] RewriteRule ^(.*)$ - [L] RewriteRule ^(.*)$ - [F]Отслеживание обращений к файлу robots.txt
Чтобы иметь больше информации о посещении поисковиков, полезно иметь подробную информацио об обращении к файлу robots.txt Для того, чтобы оганизовать это, в '.htaccess' должны быть следующие записи:
RewriteEngine on Options +FollowSymlinks RewriteBase / RewriteRule ^robots.txt$ /robot.php?%
Теперь при запросе файла 'robots.txt' наш RewriteRule переадресует посетителя (робота) к обрабатывающему запросы скрипту robot.php. Кроме того, переменная передается скрипту, которая будет обработана в соответствии с вашими нуждами. 'REQUEST_URI' определяет имя запрашиваемого файла. В данном примере это - 'robots.txt'. Скрипт прочтет содержание 'robots.txt' и отправит его web-браузеру или роботу поискового сервера. Таким образом, мы можем считать хиты посетителей и вести лог-файлы.
PHPSESSID
Для отключения добавления PHPSESSID к URL вставьте в начало index.php:
ini_set("session.use_trans_sid", 0);Либо в .htaccess пропишите:
php_flag session.use_trans_sid OffДирективы кеширования
Кэширование для всех типов файлов по времени доступа
ExpiresActive on ExpiresDefault "access plus 600 seconds"Кэширование для всех типов файлов по времени изменения
ExpiresActive on ExpiresDefault "modification plus 600 seconds"Кэширование для определённых типов файлов
ExpiresByType text/css "modification plus 600 seconds" ExpiresByType image/jpeg "modification plus 600 seconds" ExpiresByType image/gif "modification plus 600 seconds" ExpiresByType image/x-ico "modification plus 600 seconds" ExpiresByType image/png "modification plus 600 seconds"Запрет кеширования с помощью сервера Apache
Откройте файл конфигурации сервера Apache httpd.conf и раскомментируйте следующие строчки:
LoadModule expires_module modules/mod_expires.so LoadModule headers_module modules/mod_headers.so . AddModule mod_expires.c AddModule mod_headers.cВпишите в .htaccess следующее:
# Запрещение кеширования в этой папке # Необходимо включение модулей # mod_headers.c и mod_expires.c # # Заголовок Cache-ControlHeader append Cache-Control "no-store, no-cache, must-revalidate" # Заголовок ExpiresExpiresActive On ExpiresDefault "now" Необходимые заголовки будут передаваться автоматически, и специально их писать в PHP уже не нужно - кэш уже выключен!
Кеширование с помощью файла .htaccess
# Разрешение кеширования в этой папке # Необходимо включение модулей # mod_headers.c и mod_expires.c #ExpiresActive on #ExpiresDefault "access plus 1 hours" #ExpiresDefault "access plus 10 years" ExpiresDefault "access plus 1 month" ExpiresByType text/cache-manifest "access plus 0 seconds" ExpiresByType text/html "access plus 0 seconds" ExpiresByType text/xml "access plus 0 seconds" ExpiresByType application/xml "access plus 0 seconds" ExpiresByType application/json "access plus 0 seconds" ExpiresByType application/rss+xml "access plus 1 month" ExpiresByType image/x-icon "access plus 1 week" ExpiresByType image/gif "access plus 1 year" ExpiresByType image/png "access plus 1 year" ExpiresByType image/jpg "access plus 1 year" ExpiresByType image/jpeg "access plus 1 year" ExpiresByType video/ogg "access plus 1 year" ExpiresByType audio/ogg "access plus 1 year" ExpiresByType audio/mp3 "access plus 1 year" ExpiresByType video/mp4 "access plus 1 year" ExpiresByType video/webm "access plus 1 year" ExpiresByType text/x-component "access plus 1 month" ExpiresByType font/truetype "access plus 1 year" ExpiresByType font/opentype "access plus 1 year" ExpiresByType application/x-font-woff "access plus 1 year" ExpiresByType image/svg+xml "access plus 1 month" ExpiresByType application/vnd.ms-fontobject "access plus 1 year" ExpiresByType text/css "access plus 2 months" ExpiresByType application/javascript "access plus 2 months" ExpiresByType text/javascript "access plus 2 months" Header append Cache-Control "public" Кеширование javascript файлов с помощью файла .htaccess
ExpiresDefault "access plus 3 days" Будьте осторожны при кешировании, т.к. при изменении файла, пользователь может получить новый вариант только через 3 дня!
Как заставить html-страницы обрабатывать php-код?
Пропишите в своем файле .htaccess следующие строки:
RemoveHandler .php .htm .html AddHandler application/x-httpd-php .php .htm .htmlКак разместить несколько сайтов на одном виртуальном хостинге?
Чтобы разместить два или более сайтов на одном виртуальном хостинге, вопреки отведенному вам тарифным планом количеству доменов необходимо в файле ".htaccess" прописать следующие строки:
RewriteEngine On RewriteRule ^newdirectory/ - [L] RewriteCond % (www.)?newdomain.ru [NC] RewriteRule (.*) newdirectory/$1 [L]Где:
newdirectory/ - папка, в которой будет лежать второй сайт
newdomain.ru - домен, для которого мы делаем перенаправлениеОбратите внимание, что при этом у Вас будет единый почтовый аккаунт. Т.е. если, у Вас существует ящик admin@domain.ru, то после подключения домена newdomain.ru у ящика admin@domain.ru появляется второе имя - admin@newdomain.ru. А при создании любого нового ящика (например info), ему автоматически присваиваются два имени - info@domain.ru и info@newdomain.ru.
Поиск страниц больше чем в одном каталоге
Иногда необходимо позволить веб-серверу искать страницы больше чем в одном каталоге.
RewriteEngine on # во-первых попытаемся найти это в указанном месте/. # . и если нашли то заканчиваем поиск: RewriteCond /your/docroot/dir1/% -f RewriteRule ^(.+) /your/docroot/dir1/$1 [L] # во-вторых - попытаемся найти это в pub/. # . и если нашли то заканчиваем поиск: RewriteCond /your/docroot/dir2/% -f RewriteRule ^(.+) /your/docroot/dir2/$1 [L] # иначе продолжаем для других директив RewriteRule ^(.+) - [PT]Виртуальные хосты пользователей
Если Вы хотите предоставлять адреса www.subdomain.domain.ru для страниц пользователей, Вы можете использовать следующий набор правил для преобразования http://www.subdomain.domain.ru/path во внутренний путь /home/subdomain/path:
RewriteEngine on RewriteCond % ^www\.[^.]+\.ru$ RewriteRule ^(.+) %$1 [C] RewriteRule ^www\.([^.]+)\.ru(.*) /home/$1$2Повреждаются файлы при загрузке на сервер
Если при передаче файлов через формы (при указанном enctype="multipart/form-data") бинарные данные повреждаются, пропишите в /cgi-bin/.htaccess директиву:
CharsetRecodeMultipartForms Off.Ошибка загрузки SWF файлов.
Ошибки при обращении к страницам, содержащим ключевые слова,
типа $_REQUESTТакое может происходить из-за установленного модуля в Apache. По умолчанию он блокирует в запросах строки с SQL аргументами и другими потенциально опасными командами.
Возможные сообщения об ошибке:
You don't have permission to access /adm/index.php on this server. Additionally, a 404 Not Found error was encountered while trying to use an ErrorDocument to handle the request.
Запрос небезопасен и был отвергнут.
Добавьте в .htaccess
SecFilterEngine Off SecFilterScanPOST Off "POST /wp-admin/async-upload.php HTTP/1.1" 406 354 "-" "Shockwave Flash"
можно снять защиту только на загрузку файлов на сервер:
SecFilterEngine Off SecFilterScanPOST Off Оптимально снимать защиту только с той папки, в которой это необходимо, не убирая защиту со всего сайта.
Переменные сервера
Это переменные вида %
где NAME_OF_VARIABLE может быть строкой взятой из следующего списка:
| HTTP заголовки: | соединение & запрос: | |
|---|---|---|
| HTTP_USER_AGENT HTTP_REFERER HTTP_COOKIE HTTP_FORWARDED HTTP_HOST HTTP_PROXY_CONNECTION HTTP_ACCEPT |
REMOTE_ADDR REMOTE_HOST REMOTE_USER REMOTE_IDENT REQUEST_METHOD SCRIPT_FILENAME PATH_INFO QUERY_STRING AUTH_TYPE |
|
| внутренние сервера: | системные: | специальные: |
| DOCUMENT_ROOT SERVER_ADMIN SERVER_NAME SERVER_ADDR SERVER_PORT SERVER_PROTOCOL SERVER_SOFTWARE |
TIME_YEAR TIME_MON TIME_DAY TIME_HOUR TIME_MIN TIME_SEC TIME_WDAY TIME |
API_VERSION THE_REQUEST REQUEST_URI REQUEST_FILENAME IS_SUBREQ |
Эти переменные полностью соответствуют названным похожим образом MIME-заголовкам HTTP и переменным сервера Apache или полям struct tm систем Unix. Те, что являются для mod_rewrite специальными включают:
IS_SUBREQ - Будет содержать текст «true» если запрос выполняется в текущий момент как подзапрос, «false» в другом случае. Подзапросы могут быть сгенерированны модулями которым нужно иметь дело с дополнительными файлами или URI для того чтобы выполнить собственные задачи.
API_VERSION - Это версия API модуля Apache (внутренний интерфейс между сервером и модулем) в текущей сборке сервера, что определено в include/ap_mmn.h. API версия модуля соответствует используемой версии Apache (для версии Apache 1.3.14, к примеру это 19990320:10), однако это в основном интересно авторам модулей.
THE_REQUEST - Полная строка HTTP запроса отправленная браузером серверу (т.е., « GET /index.html HTTP/1.1 »). Она не включает какие-либо дополнительные заголовки отправляемые браузером.
REQUEST_URI - Ресурс, запрошенный в строке HTTP запроса.
REQUEST_FILENAME - Полный путь в файловой системе сервера к файлу или скрипту соответствующим этому запросу.
Примечания:
- Переменные SCRIPT_FILENAME и REQUEST_FILENAME содержат одинаковые значения, т.е. значение поля filename внутренней структуры request_rec сервера Apache. Первое имя – это просто широко известное имя переменной CGI, в то время как второе – это постоянная копия REQUEST_URI (содержащая значение поля uri структуры request_rec ).
- Есть специальный формат: % , где переменная может быть любой переменной окружения. Это ищется во внутренних структурах Apache и (если там нет) с помощью вызова getenv() из процесса Apache сервера.
- Есть специальный формат: % , где заголовок может быть любым именем HTTP MIME-заголовка. Это ищется в HTTP запросе. Пример: % значение HTTP заголовка « Proxy-Connection: ».
- Есть специальный формат % опережающих запросов, которые производятся внутренним (основанном на URL) подзапросом для определения конечного значения переменной. Используйте это, когда вы хотите использовать переменную для преобразований, которая реально определяется позднее, в какой-либо фазе API, и таким образом недоступна на данном этапе. Для примера, когда вы хотите преобразовать соответственно переменной REMOTE_USER из контекста сервера (файл httpd.conf ), вы должны использовать % , потому что эта переменная устанавливается в фазах авторизации, которые идут после фазы трансляции URL, в которой и работает mod_rewrite. С другой стороны, по причине реализации работы mod_rewrite в контексте каталога (файл .htaccess) через Fixup фазу API и из-за того, что фазы авторизации идут до этой фазы, вы просто можете там использовать % .
- Есть специальный формат: % , который создает внутренний (основанный на имени файла) подзапрос для определения конечного значения переменной. В основном это то же самое что и формат LA-U, приведенный выше.
Главная страница без дублирования
Обычно код главной страницы физически расположен в файле index.html или index.php, но сайт должен открываться по любому из запросов: yoursite.ru, yoursite.ru/index.html, www.yoursite.ru и www.yoursite.ru/index.html. Для поисковых систем это четыре разных URL! Если не настроить .htaccess верно, поисковик добавит в свой индекс четыре одинаковых страницы. Это признак некачественного сайта. Избежать этой проблемы можно с помощью такого кода в .htaccess:
Options +FollowSymLinks RewriteEngine on RewriteCond % ^yoursite.ru RewriteRule (.*) http://www.yoursite.ru/$1 [R=301,L] RewriteCond % ^[A-Z]\ /index\.html\ HTTP/ RewriteRule ^index\.html$ http://www.yoursite.ru/ [R=301,L]
Все страницы-дубли будут склеены редиректом с кодом 301 с главной страницей – http://www.yoursite.ru/.
Дубли страниц без слэша в конце URL
Чтобы предотвратить ситуацию с индексированием страниц www.yoursite.ru/about и www.yoursite.ru/about/ как разных, ставим следущий код:
Со страниц без слэша будет установлен редирект на «слэшевые».
RewriteCond % !-f RewriteCond % !(.*)/$ RewriteRule ^(.*)$ /$1/ [R=301,L]
Сохранение(загрузка) файлов вместо открытия
Многие видели, как при попытке скачать архив с расширением .rar браузер открывает его в виде простого текста из мешанины символов. Это значит, что на сервере сайта не настроено принудительное сохранение типов файлов, которые не должны открываться в браузере.
AddType application/octet-stream .rar .doc .mov .avi .pdf .xls .mp4
Сжатие отправляемых страниц
SetOutputFilter DEFLATE Header unset ETag FileETag None
Принудительная постановка замыкающего слеша
Следующий код всегда будет добавлять слеш в адрес URL вашего сайта, что хорошо помогает в области SEO сайта.
RewriteCond % /+[^\.]+$ RewriteRule ^(.+[^/])$ %/ [R=301,L]
Междоменное использование шрифтов для FireFox
При использовании встроенных шрифтов Firefox не позволяет брать их с внешних сайтов. Следующий код для файла .htaccess позволит обойти данное ограничение.
#Замените yourdomain.com на адрес вашего блога Header set Access-Control-Allow-Origin "http://yourdomain.com"
Выполнять PHP в файлах JavaScript
При разработке кода JavaScript иногда требуется использовать PHP в файлах .js, например, для получения данных из базы данных.
AddType application/x-httpd-php .js AddHandler x-httpd-php5 .jsSetHandler application/x-httpd-php
Разложить файлы robots.txt, sitemap.xml и т.п. в папки доменов
# Если есть запрашиваемый файл из корня сайта, в папке домена, то перенаправляем его туда RewriteCond %/domain/%/root% -f RewriteRule ^(.*)$ /domain/%/root/$1 [L]
Блокируем User Agents через .htaccess
Если вы столкнулись с проблемой, что какие-то типы User Agent нагружают ваш сервер ненужными запросами, то от них можно избавиться добавив в .htaccess следующие строчки:
SetEnvIfNoCase User-Agent "^Black Hole" bad_bot SetEnvIfNoCase User-Agent "^Titan" bad_bot SetEnvIfNoCase User-Agent "^WebStripper" bad_bot SetEnvIfNoCase User-Agent "^NetMechanic" bad_bot SetEnvIfNoCase User-Agent "^CherryPicker" bad_bot SetEnvIfNoCase User-Agent "^EmailCollector" bad_bot SetEnvIfNoCase User-Agent "^EmailSiphon" bad_bot SetEnvIfNoCase User-Agent "^WebBandit" bad_bot SetEnvIfNoCase User-Agent "^EmailWolf" bad_bot SetEnvIfNoCase User-Agent "^ExtractorPro" bad_bot SetEnvIfNoCase User-Agent "^CopyRightCheck" bad_bot SetEnvIfNoCase User-Agent "^Crescent" bad_bot SetEnvIfNoCase User-Agent "^Wget" bad_bot SetEnvIfNoCase User-Agent "^SiteSnagger" bad_bot SetEnvIfNoCase User-Agent "^ProWebWalker" bad_bot SetEnvIfNoCase User-Agent "^CheeseBot" bad_bot SetEnvIfNoCase User-Agent "^Teleport" bad_bot SetEnvIfNoCase User-Agent "^TeleportPro" bad_bot SetEnvIfNoCase User-Agent "^MIIxpc" bad_bot SetEnvIfNoCase User-Agent "^Telesoft" bad_bot SetEnvIfNoCase User-Agent "^Website Quester" bad_bot SetEnvIfNoCase User-Agent "^WebZip" bad_bot SetEnvIfNoCase User-Agent "^moget/2.1" bad_bot SetEnvIfNoCase User-Agent "^WebZip/4.0" bad_bot SetEnvIfNoCase User-Agent "^WebSauger" bad_bot SetEnvIfNoCase User-Agent "^WebCopier" bad_bot SetEnvIfNoCase User-Agent "^NetAnts" bad_bot SetEnvIfNoCase User-Agent "^Mister PiX" bad_bot SetEnvIfNoCase User-Agent "^WebAuto" bad_bot SetEnvIfNoCase User-Agent "^TheNomad" bad_bot SetEnvIfNoCase User-Agent "^WWW-Collector-E" bad_bot SetEnvIfNoCase User-Agent "^RMA" bad_bot SetEnvIfNoCase User-Agent "^libWeb/clsHTTP" bad_bot SetEnvIfNoCase User-Agent "^asterias" bad_bot SetEnvIfNoCase User-Agent "^httplib" bad_bot SetEnvIfNoCase User-Agent "^turingos" bad_bot SetEnvIfNoCase User-Agent "^spanner" bad_bot SetEnvIfNoCase User-Agent "^InfoNaviRobot" bad_bot SetEnvIfNoCase User-Agent "^Harvest/1.5" bad_bot SetEnvIfNoCase User-Agent "^Bullseye/1.0" bad_bot SetEnvIfNoCase User-Agent "^Mozilla/4.0 (compatible; BullsEye; Windows 95)" bad_bot SetEnvIfNoCase User-Agent "^Crescent Internet ToolPak HTTP OLE Control v.1.0" bad_bot SetEnvIfNoCase User-Agent "^CherryPickerSE/1.0" bad_bot SetEnvIfNoCase User-Agent "^CherryPicker /1.0" bad_bot SetEnvIfNoCase User-Agent "^WebBandit/3.50" bad_bot SetEnvIfNoCase User-Agent "^NICErsPRO" bad_bot SetEnvIfNoCase User-Agent "^Microsoft URL Control - 5.01.4511" bad_bot SetEnvIfNoCase User-Agent "^DittoSpyder" bad_bot SetEnvIfNoCase User-Agent "^Foobot" bad_bot SetEnvIfNoCase User-Agent "^WebmasterWorldForumBot" bad_bot SetEnvIfNoCase User-Agent "^SpankBot" bad_bot SetEnvIfNoCase User-Agent "^BotALot" bad_bot SetEnvIfNoCase User-Agent "^lwp-trivial/1.34" bad_bot SetEnvIfNoCase User-Agent "^lwp-trivial" bad_bot SetEnvIfNoCase User-Agent "^Wget/1.6" bad_bot SetEnvIfNoCase User-Agent "^BunnySlippers" bad_bot SetEnvIfNoCase User-Agent "^Microsoft URL Control - 6.00.8169" bad_bot SetEnvIfNoCase User-Agent "^URLy Warning" bad_bot SetEnvIfNoCase User-Agent "^Wget/1.5.3" bad_bot SetEnvIfNoCase User-Agent "^LinkWalker" bad_bot SetEnvIfNoCase User-Agent "^cosmos" bad_bot SetEnvIfNoCase User-Agent "^moget" bad_bot SetEnvIfNoCase User-Agent "^hloader" bad_bot SetEnvIfNoCase User-Agent "^humanlinks" bad_bot SetEnvIfNoCase User-Agent "^LinkextractorPro" bad_bot SetEnvIfNoCase User-Agent "^Offline Explorer" bad_bot SetEnvIfNoCase User-Agent "^Mata Hari" bad_bot SetEnvIfNoCase User-Agent "^LexiBot" bad_bot SetEnvIfNoCase User-Agent "^Web Image Collector" bad_bot SetEnvIfNoCase User-Agent "^The Intraformant" bad_bot SetEnvIfNoCase User-Agent "^True_Robot/1.0" bad_bot SetEnvIfNoCase User-Agent "^True_Robot" bad_bot SetEnvIfNoCase User-Agent "^BlowFish/1.0" bad_bot SetEnvIfNoCase User-Agent "^JennyBot" bad_bot SetEnvIfNoCase User-Agent "^MIIxpc/4.2" bad_bot SetEnvIfNoCase User-Agent "^BuiltBotTough" bad_bot SetEnvIfNoCase User-Agent "^ProPowerBot/2.14" bad_bot SetEnvIfNoCase User-Agent "^BackDoorBot/1.0" bad_bot SetEnvIfNoCase User-Agent "^toCrawl/UrlDispatcher" bad_bot SetEnvIfNoCase User-Agent "^WebEnhancer" bad_bot SetEnvIfNoCase User-Agent "^TightTwatBot" bad_bot SetEnvIfNoCase User-Agent "^suzuran" bad_bot SetEnvIfNoCase User-Agent "^VCI WebViewer VCI WebViewer Win32" bad_bot SetEnvIfNoCase User-Agent "^VCI" bad_bot SetEnvIfNoCase User-Agent "^Szukacz/1.4" bad_bot SetEnvIfNoCase User-Agent "^QueryN Metasearch" bad_bot SetEnvIfNoCase User-Agent "^Openfind data gathere" bad_bot SetEnvIfNoCase User-Agent "^Openfind" bad_bot SetEnvIfNoCase User-Agent "^Xenu's Link Sleuth 1.1c" bad_bot SetEnvIfNoCase User-Agent "^Xenu's" bad_bot SetEnvIfNoCase User-Agent "^Zeus" bad_bot SetEnvIfNoCase User-Agent "^RepoMonkey Bait & Tackle/v1.01" bad_bot SetEnvIfNoCase User-Agent "^RepoMonkey" bad_bot SetEnvIfNoCase User-Agent "^Zeus 32297 Webster Pro V2.9 Win32" bad_bot SetEnvIfNoCase User-Agent "^Webster Pro" bad_bot SetEnvIfNoCase User-Agent "^EroCrawler" bad_bot SetEnvIfNoCase User-Agent "^LinkScan/8.1a Unix" bad_bot SetEnvIfNoCase User-Agent "^Keyword Density/0.9" bad_bot SetEnvIfNoCase User-Agent "^Kenjin Spider" bad_bot SetEnvIfNoCase User-Agent "^Cegbfeieh" bad_botOrder Allow,Deny Allow from all Deny from env=bad_bot
Переадресация по языку
RewriteEngine on RewriteCond % (ru) [NC] RewriteRule .* КУДА [L]
Защита картинок от скачивания по ссылкам на других сайтах
Включая переходы без REFERER, т.е. когда адрес указывают в строке браузера.
RewriteEngine on RewriteCond % !^$ RewriteCond % !^http(s)?://(www\.)?yourdomain.com [NC] RewriteRule \.(jpg|jpeg|png|gif)$ КУДА_ПОСЛАТЬ [NC,R,L]
Только по сссылкам на чужих сайтах:
RewriteEngine on RewriteCond % !^http(s)?://(www\.)?yourdomain.com [NC] RewriteRule \.(jpg|jpeg|png|gif)$ КУДА_ПОСЛАТЬ [NC,R,L]
Блокировать пользователей с определенным рефером
Если вы не хотите, чтобы пользователи переходя с определенных сайтов попадали на ваш, вы можете это запретить.
RewriteEngine on RewriteCond % bannedurl1.com [NC,OR] RewriteCond % bannedurl2.com [NC,OR] RewriteRule .* - [F]
bannedurl1.com и bannedurl2.com — примеры запрещенных сайтов.
Ограничение размера файла загрузки в PHP, максимального размера запроса и максимального времени выполнения скрипта
Объем загружаемого файла:
php_value upload_max_filesize 15M
Максимальный размер запроса для загрузки в PHP:
php_value post_max_size 10M
Время выполнения скрипта:
php_value max_execution_time 240
Время для скрипта на разбор введенных данных:
php_value max_input_time 180
Указываем для IE режим вывода
Установка заголовка X-UA-Compatible:
Header set X-UA-Compatible "IE=Edge"
Установка Vary: Accept-Encoding
Для поисковой оптимизации и уменьшения времени загрузки страницы, Google рекомендует установить заголовок Vary: Accept-Encoding
Заголовок ответа HTTP/1.1 Vary позволяет серверу указать, что закэшированный ресурс может использоваться без проверки только, если указанные в Vary заголовки совпадают с заголовками запроса. Значения: Accept-Encoding, Host, User-Agent, Accept-Language.
Header append Vary: Accept-Encoding
Общий файл картинки для всех доменов (глобальные алиасы)
Alias /javascripts /usr/share/javascript/ Options FollowSymLinks MultiViews
Положите общий файл, например, icon.png в директорию /usr/share/javascript/
В файл /etc/javascript-common/javascript-common.conf и добавьте строку:
Alias /apple-touch-icon-precomposed.png /usr/share/javascript/icon.png
При загрузке .doc, .docx файлы открываются в браузере с непонятной кодировкой
Если у вас открываются .doc, .docx файлы в браузере с непонятной кодировкой и вы хотите чтобы при левом клике файл сохранялся, а не открывался, то вам необходимо прописать в .htaccess:
AddType application/force-download doc AddType application/force-download docx AddType application/force-download xls AddType application/force-download xlsx
Перенаправление на безопасное соединение https
Если вы используете https и хотите, чтобы все пользователи перенаправлялись на него, то вам поможет следующий код:
RewriteEngine On RewriteCond % !on RewriteRule (.*) https://%%
Доступ если установлена cookie с помощью htaccess
Если Ваш логин на сайте admin и он устанавливается в куку с именем login Вы можеле легко закрыть доступ посторонним в любую директорию. Для этого создайте в этой директории(папке) файл .htaccess со следующим содержимым:
RewriteEngine On RewriteCond % !login=admin [NC] RewriteRule .* http://%/ [L,R=301]
По этому же принципу можно закрывать сайт на профилактические работы для всех кроме админа.
Доступ к заголовкам «If-Modified-Since» и «If-None-Match» для реализации http 304 ответа
Если PHP не установлен как модуль Apache, то для доступа к заголовкам «If-Modified-Since» и «If-None-Match» необходимо в корневом каталоге веб-сайта поместить файл .htaccess следующего содержания:
RewriteEngine On RewriteRule .* — [E=HTTP_IF_MODIFIED_SINCE:%] RewriteRule .* — [E=HTTP_IF_NONE_MATCH:%]
После этого, необходимые заголовки будут доступны как $_SERVER['HTTP_IF_MODIFIED_SINCE'] и $_SERVER['HTTP_IF_NONE_MATCH'].
Следует заметить, что заголовки «If-Modified-Since» и «If-None-Match» не отправляются браузером, если в предыдущих запросах к данной странице он не получал в ответе веб-сервера заголовок «Last-Modified». Кроме того, при использовании в веб-приложении сессий с установками по умолчанию, указанные заголовки также не будут присылаться браузером. Для того чтобы избежать такого поведения браузера, необходимо перед запуском сессии выполнять функцию session_cache_limiter, передавая в качестве аргумента параметр 'private_no_expire':
session_cache_limiter('private_no_expire'); session_start();
Пред и пост обработка с помощью .htaccess
# Запуск перед запрашиваемым файлом php_value auto_prepend_file "/dir/header.php" # Запуск после запрашиваемого файла php_value auto_append_file "/dir/footer.php"
Кроме этого дополнительную информацию по теме можно почерпнуть:
- www.egoroff.spb.ru - примеры переадресаций
- htaccess.net.ru - дополнительная информация по htaccess
Using .htaccess to make all .html pages to run as .php files?
I need to run all of my .html files as .php files and I don't have time to change all of the links before our presentation tomorrow. Is there any way to "hack" this with my Apache server?
asked Jan 14, 2011 at 1:33
Michael Novello Michael Novello
583 1 1 gold badge 4 4 silver badges 5 5 bronze badges
Though it's not a direct answer to your question, using sed or any good IDE will allow you find-and-replace across an entire directory/project. Also, you can batch rename files pretty easily on Linux.
Jan 14, 2011 at 1:43
Yes but if you rename the files using sed, you might get many broken links. Of course, you can also try to change all the links in your website, but there's also links from all over the Internet that might point to your website.
Jan 14, 2011 at 2:26
19 Answers 19
Create a .htaccess file at the root of your website and add this line:
[Apache2 @ Ubuntu/Debian: use this directive]
AddType application/x-httpd-php .html .htm
Or, from comment below:
AddType application/x-httpd-php5 .html .htm
If your are running PHP as CGI (probably not the case), you should write instead:
AddHandler application/x-httpd-php .html .htm
4,984 7 7 gold badges 56 56 silver badges 117 117 bronze badges
answered Jan 14, 2011 at 1:36
Marc-François Marc-François
3,900 3 3 gold badges 28 28 silver badges 47 47 bronze badges
I had to add 5 to the end of the type for it to work, i.e. AddType application/x-httpd-php5 .html .htm (CentOS running PHP 5.3)
Apr 9, 2014 at 9:17
This doesn't work for me. It makes Firefox want to download the html file and display it.
Apr 17, 2014 at 0:30
@LeeBlake I am having the same issue. Any luck with this?
Jun 27, 2015 at 20:23
it causing file to be downloading
Jun 25, 2018 at 11:14
@AndreiKrasutski Done that. Still downloading.
Feb 2, 2020 at 19:46
In My Godaddy Server the following code worked
Options +ExecCGI AddType application/x-httpd-php .php .html AddHandler x-httpd-php5 .php .html
39.7k 20 20 gold badges 94 94 silver badges 123 123 bronze badges
answered Mar 9, 2013 at 9:50
139 1 1 silver badge 3 3 bronze badges
I think mentioning "Godaddy" robs you off your first spot.
Aug 11, 2015 at 7:49
This is in edition to all other right answers:
If you are not able to find the correct Handler, Simply create a .php file with the following contents:
and run/open this file in browser.

Use this output in .htaccess file
Create a .htaccess file at the root of your website(usually a folder named public_html or htdocs on linux servers) and add this line:
AddType [[THE OUTPUT FROM ABOVE FILE]] .html .htm
AddType application/x-httpd-php70 .html .htm
Important Note:
If you see blank page or Notice: Undefined index: REDIRECT_HANDLER
Try default in .htaccess
AddHandler application/x-httpd-php .html
1 1 1 silver badge
answered Mar 20, 2018 at 3:12
569 8 8 silver badges 19 19 bronze badges
Perfect! Thank You!
Jan 22, 2020 at 19:52
Is there a way to determine this handler in another way? Because $_SERVER['REDIRECT_HANDLER'] is returning null in my case 🙁
Jun 11, 2020 at 7:01
You may also use the H or T flag of mod_rewrite to force all .html files to be parsed by php handler :
using H (Handler) flag:
RewriteEngine on RewriteRule \.(html|htm)$ - [H=application/x-httpd-php5]
using T (Type) flag :
RewriteEngine on RewriteRule \.(html|htm)$ - [T=application/x-httpd-php5]
Or you can add more extensions to the rule pattern seprated by a pipe | that you want to be parsed by php handler
RewriteRule \.(html|htm|txt|foo)$ - [T=application/x-httpd-php5]
the example above will change the mime type of files that end with .html , .htm , .txt , .foo to php.
Note : on some servers you will have to change php5 to php to get this example to work in handler string:
[T=application/x-httpd-php5]
[T=application/x-httpd-php]
answered Nov 30, 2015 at 19:01
Amit Verma Amit Verma
40.9k 21 21 gold badges 93 93 silver badges 115 115 bronze badges
You need to add the following line into your Apache config file:
AddType application/x-httpd-php .htm .html
You also need two other things:
-
Allow Overridding In your_site.conf file (e.g. under /etc/apache2/mods-available in my case), add the following lines:
"> AllowOverride All
sudo a2enmod rewrite
After any of those steps, you should restart apache:
sudo service apache2 restart
157k 88 88 gold badges 680 680 silver badges 747 747 bronze badges
answered Mar 26, 2016 at 20:23
3,481 2 2 gold badges 44 44 silver badges 71 71 bronze badges
For anyone out there still having trouble,
try this (my hosting was from Godaddy and this is the only thing that worked for me among all the answers out there.
AddHandler x-httpd-php5-cgi .html
answered Aug 28, 2012 at 20:11
1,622 2 2 gold badges 22 22 silver badges 44 44 bronze badges
Running .html files as php stopped working all of a sudden in my .htaccess file.
Godaddy support had me change it to:
AddHandler application/x-httpd-lsphp .html
answered Jun 20, 2018 at 20:35
Mike Slaught Mike Slaught
89 1 1 silver badge 6 6 bronze badges
The correct answer varies depending on webserver configuration. This one is the correct answer in my case too (and I'm not with GoDaddy) . so if you're having problems, it's probably best to check with your web host.
Dec 23, 2018 at 15:02
It depends wether your hosting provider uses LSAPI (LiteSpeed) version of PHP handler then you have to use application/x-httpd-lsphp instead of application/x-httpd-php
Jun 4, 2019 at 10:13
Works for my hostgator shared server. Thank you
Jun 16 at 20:01
I think this is the best way to run php script on html and htm pages:
AddType application/x-httpd-php5 .html .htm
54k 28 28 gold badges 137 137 silver badges 148 148 bronze badges
answered Apr 27, 2013 at 16:25
41 3 3 bronze badges
Normally you should add:
Options +ExecCGI AddType application/x-httpd-php .php .html AddHandler x-httpd-php5 .php .html
However for GoDaddy shared hosting (php-cgi), you need to add also these lines:
AddHandler fcgid-script .html FCGIWrapper /usr/local/cpanel/cgi-sys/php5 .html
157k 88 88 gold badges 680 680 silver badges 747 747 bronze badges
answered Dec 19, 2014 at 23:01
user4379513 user4379513
This worked with hostgator shared hosting as well. Thanks.
Jun 27, 2015 at 20:24
I am using godaddy and that is the only one that's worked for me. others either don't work or download the html page without displaying it!
Aug 3, 2016 at 17:21
here put this in your .htaccess
AddType application/x-httpd-php .php .htm .html
more info on this page
answered Jan 14, 2011 at 1:35
3,761 4 4 gold badges 30 30 silver badges 37 37 bronze badges
Using @Marc-François approach Firefox prompted me to download the html file
Finally the following is working for me (using both):
AddType application/x-httpd-php .htm .html AddHandler x-httpd-php .htm .html
answered Jul 3, 2015 at 7:26
Philipp Michael Philipp Michael
954 1 1 gold badge 11 11 silver badges 22 22 bronze badges
AddHandler application/x-httpd-php .php .html .htm // or AddType application/x-httpd-php .php .htm .html
answered Jan 27, 2017 at 22:30
11 2 2 bronze badges
Please use the edit link to explain how this code works and don't just give the code, as an explanation is more likely to help future readers. See also How to Answer. source
Jan 27, 2017 at 22:50
I'm using PHP7.1 running in my Raspberry Pi 3.
In the file /etc/apache2/mods-enabled/php7.1.conf I added at the end:
AddType application/x-httpd-php .html .htm .png .jpg .gif
answered Mar 22, 2018 at 13:45
140 1 1 silver badge 9 9 bronze badges
On Dreamhost Servers you can refer to this page that at time of writing indicates you may use the following for php 7.2 with FastCGI:
AddHandler fcgid-script .html FcgidWrapper "/dh/cgi-system/php72.cgi" .html
Or if you are using php5 cgi (not FastCGI):
AddHandler php5-cgi .html
answered Sep 12, 2019 at 0:47
5,972 4 4 gold badges 29 29 silver badges 36 36 bronze badges
None of the answers posted here worked for me.
In my case the problem was, by the one hand, that the .conf file (/etc/apache2/sites-available/default-ssl.conf or /etc/apache2/sites-available/000-default.conf) did not contain the directive AllowOverride All for the site directory, which caused the .htaccess to not been processed. To solve this, add:
Options Indexes FollowSymLinks AllowOverride All Require all granted
On the other hand, the problem was that the .htaccess was created by the root user, and therefore the apache user could not read it. So, changing the file owner solved definitely the problem:
chown www-data:www-data .htaccess