RewriteRule ^(.*)$ index.php [L]
RewriteCond %{SCRIPT_FILENAME} !-f
RewriteCond %{SCRIPT_FILENAME} !-d
RewriteRule ^(.*)$ $1.html [L]
Первое правило переписывает все в index.php
. Следующие директивы эффективно игнорируются.
Однако второе правило также переписывает все (тот же шаблон ^(.*)$
- очевидный конфликт), которое не сопоставляется с существующим файлом или каталогом добавить расширение .html
. Это второе правило является более ограничительным.
Похоже, что вы хотите сделать:
- Добавить расширение
.html
к URL-адресам, которые будут сопоставлены с .html
файлами. - Переписать все другие запросы, которые (я предполагаю) не сопоставляются с физическими файлами и каталогами, с
index.php
.
Дополнительные предположения
-
.htaccess
файл находится в документе root. - Запрошенные URL-адреса, которые должны соответствовать
.html
файлам, не содержат точек в URL-пути. Таким образом, точки в URL-пути указывают только на расширение файла. - Если вы буквально переписываете все остальное на
index.php
(как вы делали), то оно также переписывает все ваши данные c ресурсов (CSS, JS, изображения и т. Д. c.), Поэтому я предполагаю, что вы хотите сделать исключения для статических c ресурсов и всего, что в противном случае сопоставлялось бы с файлом или каталогом.
Попробуйте вместо этого:
RewriteEngine On
# Append the ".html" extension if the target file exists
RewriteCond %{DOCUMENT_ROOT}/$1.html -f
RewriteRule ^([^.])$ $1.html [L]
# Rewrite other requests that don't map to files/directories to index.php
RewriteCond %{SCRIPT_FILENAME} !-f
RewriteCond %{SCRIPT_FILENAME} !-d
RewriteRule !\.(?:css|js|jpg|png|gif)$ index.php [L]