Премахване на .html от URL адреса с mod_rewrite

Тази статия е продължение на статията Приложна магия с mod_rewrite в htaccess и отговаря на въпрос зададен като коментар: „очаквам след като изпиша примерно: http://www.domain.com/za_nas.html – в полето за адреси да се вижда само http://www.domain.com/za_nas.
Тъй като решението не е много лесно, защото има подслучаи, написах отговора като отделна статия.

Задача за премахване на html разширение на уеб страница в адресната лента на браузъра

Скриване на разширението на файла.html. Когато в браузъра се напише http://domain/page.html да се отваря html страницата, но в адреса да се замества с http://domain/page

Специални изисквания за заместване

Ако в една и съща директория има файл /page.html и поддиректория /page/, то потребителя трябва да получава файла, когато напише /page и директорията, когато напише /page/.

Ако в директорията има файл /page.html и /page.pdf (или някакъв друг различен от html), то потребителя трябва да получава /page.html, когато напише /page.

Примери за поведение на пренаписващия скрипт

Използва се следния формат: написва -> зарежда се -> вижда в адресната лента на браузъра

http://domain.com/page.html -> http://domain.com/page.html -> http://domain.com/page

http://domain.com/index -> http://domain.com/index.html -> http://domain.com/

http://domain.com/index.html -> http://domain.com/index.html -> http://domain.com/

http://domain.com/index.txt -> http://domain.com/index.txt -> http://domain.com/index.txt

Ако в главната уеб директория има поддиректория /doc и файл /doc.html, а в директорията doc има два файла err.html и index.html

http://domain.com/doc.html -> http://domain.com/doc.html -> http://domain.com/doc

http://domain.com/doc -> http://domain.com/doc.html -> http://domain.com/doc

http://domain.com/doc/ -> http://domain.com/doc/index.html -> http://domain.com/doc/

http://domain.com/doc/err -> http://domain.com/doc/err.html -> http://domain.com/doc/err

http://domain.com/doc/err.html -> http://domain.com/doc/err.html -> http://domain.com/doc/err

Ако в поддиректорията /doc няма index.html, то при написване на http://domain.com/doc/ ще получи грешка Forbidden.

Решение

Следва кода за файла .htaccess любезно написан, тестван и предоставен за безплатно ползване от ganbox.com

# Спира MultiViews (за да може /abc да го търси като /abc.ext преди /abc/)
Options +FollowSymLinks -MultiViews

DirectoryIndex index.html

# Спира mod_dir, за да не добавя наклонена черта в края.
DirectorySlash Off

RewriteEngine On

# Ако търси /index или /index.html
RewriteCond %{THE_REQUEST} \ /(.+/)?index(\.html)?(\?.*)?\  [NC]
# го изтрива и оставя само /
RewriteRule ^(.+/)?index(\.html)?$ /%1 [R=301,L]

# Добавя наклонена черта в края на директория, ако няма файл с .html
# Ако търси директория
RewriteCond %{SCRIPT_FILENAME}/ -d
# и няма html файл с такова име
RewriteCond %{SCRIPT_FILENAME}.html !-f
# и няма наклонена черта, я добавя.
RewriteRule [^/]$ %{REQUEST_URI}/ [R=301,L]

# Изтрива HTML разширения
# Ако това е заявка от браузър (а не от Apache/mod_rewrite)
RewriteCond %{ENV:REDIRECT_STATUS} ^$
# и заявката има HTML разширение, го изтрива.
RewriteRule ^(.+)\.html$ /$1 [R=301,L]

# Ако в заявката има .html разширение
RewriteCond %{SCRIPT_FILENAME}.html -f
# и няма наклонена черта, добавя .html
RewriteRule [^/]$ %{REQUEST_URI}.html [QSA,L]
Прочетена:12494
1 - лоша2 - слаба3 - средна4 - добра5 - отлична (2 гласа, оценка: 5,00 от 5. Моля изберете оценка!)
Loading...

12 коментара

  1. Богдан 18.02.2010
  2. Богдан 18.02.2010
  3. gan 18.02.2010
  4. Богдан 19.02.2010
  5. Светослав 02.05.2010
  6. maxpowerbg 01.07.2010
  7. gan 01.07.2010
  8. Тошко 19.08.2014
споделиха