Премахване на .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]

Прочетена:19277
1 - лоша2 - слаба3 - средна4 - добра5 - отлична (2 гласа, оценка: 5,00 от 5. Моля изберете оценка!)
Loading...
Георги Стефанов
Магистър по информатика, който се занимава с компютри от 1988 г., професионално с програмиране от 1998 г., а с уеб технологии от 2002 г. Има богат опит при оптимизиране на бизнес сайтове. Повече от 15 години развива успешно свои уеб проекти и работи с български и международни компании за постоянно подобряване на техните сайтове и увеличаване на онлайн продажбите. 

12 comments on “Премахване на .html от URL адреса с mod_rewrite”

  1. ами правя един .htaccess файл и копирам цялото това съдържание в него, слагам файла в главната директория и нищо не става

    излиза ей това: Internal Server Error
    The server encountered an internal error or misconfiguration and was unable to complete your request.

    Please contact the server administrator, root@ host.bg and inform them of the time the error occurred, and anything you might have done that may have caused the error.

    More information about this error may be available in the server error log.

  2. впрочем става, но като е да друг сървър, явно ина някакъв проблем със сървъра на ХОСТ.БГ, някаква идея какво да направя, тъй като хоствам в хост.бг

  3. На първо място .htaccess файла трябва да има права за достъп 755, а не 775 (в някой FTP клиенти 755 се вижда като rw-r--r-- а пък 775 се показва като rw-rw-r-- ). Ако това не помогне свържи се с поддръжката на host.bg тъй като на тях си платил.
    Аз приемам благодарности под формата на дарение http://ganbox.com/blog/donate/ или като връзка към сайта виж в http://ganbox.com/about 😉

  4. Здравейте,
    Първо да изкажа благодарности към съдържателите на сайта. Наистина доста ценна информация има в него. По повод скрипта, дали той би работил на различен сървър от Apache?
    Някъде прочетох, че модула mod_rewrite е създаден за Apache и за друг тип сървър не е приложим.

  5. Благодарско на собственика на статията! Поставих .htaccess-a и всичко стана от раз, между другото преди пак бях искала да го направя и така и не успях, сега с този код всичко стана от първия път.
    Искам да попитам а долу в „Статус Бар-а“, в левия ъгъл на браузъра, там може ли да не се вижда разширението, тъй като ида върху някой линк, там се изписва разширението, …благодаря

  6. @Светослав скоро не съм ползвал друг уеб сървър различен от Apache и не мога да отговоря категорично. Ти какъв сървър ползваш?

    @maxpowerbg коментарите ти бяха влезли в спам, моля пиши истинско име, а не псевдоним като пускаш коментари.
    Един начин за скриване на адреса в статус бара е чрез JavaScript код.

  7. Просто ще добавя - грешката най-вероятно излиза от Options +FollowSymLinks -MultiViews, ако ви излезе грешка. Примерно при space .bg няма да работи - въпрос на конфигурация 🙂

  8. Мартин Радев@ благодаря за инфото

  9. Много, много благодаря за персоналното ти внимание, Георги. И за перфектния код - дори и аз успях да го подкарам!!!

  10. Искам да помоля за малком помощ, имам такива адреси:
    index.php?fid=$1&id=$2 пробвах да ги редиректна към: catalog-([^/]+)-([^/]+) но не се редиректва, иначе като изпиша ръчно се отваря, къде бъркам, ето това е кода в htaccess:

    Options +FollowSymLinks -Indexes -MultiViews
    RewriteEngine On
    RewriteBase /
    RewriteRule ^catalog-([^/]+)-([^/]+) index.php?fid=$1&id=$2
    

    Ще бъда благодарен ако някой помогне

  11. Не е много ясно какво целиш, но опитай с RewriteRule ^catalog-([^-]+)-([^-]+) ... Ако id е число, тогава: RewriteRule ^catalog-([^-]+)-(\d+) ... По същия начин за fid. Тогава адреса /catalog-11-22 ще отваря адреса /index.php?fid=11&id=22

споделиха
linkedin facebook pinterest youtube rss twitter instagram facebook-blank rss-blank linkedin-blank pinterest youtube twitter instagram