Как удалить .html из URL?


113

Как убрать .htmlиз URL статической страницы?

Кроме того, мне нужно перенаправить любой URL-адрес .htmlна тот, который его не использует. (т.е. www.example.com/page.htmlк www.example.com/page).


1
Под «удалить .html» вы имеете в виду «не требовать наличия .html»?
Гонки за легкостью на орбите

@Tomalak: Да, а также перенаправлять URL-адреса с ".html" на те, у которых нет. Моя проблема в том, что это приводит к бесконечному перенаправлению. Моя текущая настройка позволяет сделать доступными и www.example.com/page.html, и www.example.com/page, что не подходит для SEO.
Дэйв


@Tomalak: Спасибо за советы. Чтение документации mod_rewrite было очень полезным.
Дэйв

Ответы:


107

Я думаю, что некоторое объяснение ответа Джона было бы конструктивным. Последующий:

RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d

проверяет, что если указанный файл или каталог соответственно не существует, то правило перезаписи выполняется:

RewriteRule ^(.*)\.html$ /$1 [L,R=301]

Но что это значит? Он использует регулярное выражение (регулярные выражения) . Вот кое-что, что я сделал ранее ... введите описание изображения здесь

Я думаю , что это правильно.

ПРИМЕЧАНИЕ. При тестировании .htaccess не используйте 301 редирект. Используйте 302, пока не закончите тестирование, так как браузер будет кэшировать 301 сек. См. Https://stackoverflow.com/a/9204355/3217306

Обновление: я немного ошибся, .соответствует всем символам, кроме новой строки, поэтому включает пробелы. Кроме того, вот полезная шпаргалка по регулярным выражениям

Источники:

http://community.sitepoint.com/t/what-does-this-mean-rewritecond-request-filename-fd/2034/2

https://mediatemple.net/community/products/dv/204643270/using-htaccess-rewrite-rules


7
Превосходная диаграмма, помогающая объяснить ответ.
Ric

Наконечник на 301-е и кеш браузера - вот что решило мои проблемы.
bgfvdu3w

@KnocksX Я больше не веб-мастер и не в состоянии помочь
binaryfunt

84

Чтобы удалить расширение .html из ваших URL-адресов, вы можете использовать следующий код в root / htaccess:

RewriteEngine on


RewriteCond %{THE_REQUEST} /([^.]+)\.html [NC]
RewriteRule ^ /%1 [NC,L,R]

RewriteCond %{REQUEST_FILENAME}.html -f
RewriteRule ^ %{REQUEST_URI}.html [NC,L]

ПРИМЕЧАНИЕ. Если вы хотите удалить любое другое расширение, например, чтобы удалить расширение .php, просто замените везде html на php в приведенном выше коде.


10
Ни один из других ответов не помог мне, но этот, большое спасибо!
Emmet Arries

2
этот тоже работал у меня. Спасибо @starkeen. Голосуйте ^.
JeremyS

2
Работал на отлично. Спасибо!
ixany

этот удаляет расширение файла для меня, но не перенаправляет на эту страницу
Бхаргав Венкатеш

74

С помощью .htaccess под apache вы можете выполнить перенаправление следующим образом:

RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)\.html$ /$1 [L,R=301] 

Что касается удаления .html из URL-адреса, просто укажите ссылку на страницу без .html.

<a href="http://www.example.com/page">page</a>

23
Мне это ничего не дает. Есть ли причина, по которой это не сработает?
Майкл Яворски 02

У вас есть настоящий файл по запрошенной ссылке? Это было бы вызвать!-f
Martijn

72

Это должно сработать для вас:

#example.com/page will display the contents of example.com/page.html
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME}.html -f
RewriteRule ^(.+)$ $1.html [L,QSA]

#301 from example.com/page.html to example.com/page
RewriteCond %{THE_REQUEST} ^[A-Z]{3,9}\ /.*\.html\ HTTP/
RewriteRule ^(.*)\.html$ /$1 [R=301,L]

3
Я получал 404 в Godaddy с этим кодом, и я исправил его, поставив: Options + FollowSymLinks -MultiViews -Indexes вверху.
Лабанино

1
Думаю, это лучший и наиболее полный ответ, спасибо!
ctekk

Я пытался сделать это на локальном хосте, но он не работает. Есть ли что-то еще, что мне нужно сделать, нужно ли связывать файл .htaccess или как страница его распознает?
Пианист-программист

Как добавить расширение .php к # 301 из example.com/page.html в example.com/page, возможно ли это?

20

Вам также нужно будет убедиться, что у вас есть Options -MultiViews.

Ничего из вышеперечисленного не помогло мне на стандартном хосте cPanel.

Это сработало:

Options -MultiViews
RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^([^\.]+)$ $1.html [NC,L]

Из всех вышеперечисленных ответов этот наконец-то сработал ... Я считаю, потому что мой сайт размещен на godaddy с помощью cPanel. Ключ - Options -MultiViews
Брэд Вандербуш

Да ничего в этом разделе не работает, ждите такого ответа! Вы спасли день!
Нил

Спасибо друг. Я не уверен, почему другие не сработали так, как ожидалось.
Nanoo,

13

Спасибо за ответы. Я уже решил свою проблему. Предположим, у меня есть мои страницы в http://www.yoursite.com/html , применяются следующие правила .htaccess .

<IfModule mod_rewrite.c>
   RewriteEngine On
   RewriteCond %{THE_REQUEST} ^[A-Z]{3,9}\ /html/(.*).html\ HTTP/
   RewriteRule .* http://localhost/html/%1 [R=301,L]

   RewriteCond %{THE_REQUEST} ^[A-Z]{3,9}\ /html/(.*)\ HTTP/
   RewriteRule .* %1.html [L]
</IfModule>

6

Я использую этот .htacess для удаления расширения .html с моего сайта, убедитесь, что это правильный код:

    RewriteEngine on
RewriteBase /
RewriteCond %{http://www.proofers.co.uk/new} !(\.[^./]+)$
RewriteCond %{REQUEST_fileNAME} !-d
RewriteCond %{REQUEST_fileNAME} !-f
RewriteRule (.*) /$1.html [L]
RewriteCond %{THE_REQUEST} ^[A-Z]{3,9}\ /([^.]+)\.html\ HTTP
RewriteRule ^([^.]+)\.html$ http://www.proofers.co.uk/new/$1 [R=301,L]

Мне показалось, что это сработало, в отличие от других решений, представленных здесь, спасибо. Я бы добавил, что вам все равно нужно обновить ссылку (-ы) в вашем HTML (поэтому, если вы изначально ссылаетесь на свой .html-файл как <a href="page1.html"> </a>, вам следует обновить это как <a href=" example.com/page1"> </ a >, и тогда он будет работать.)
Лоренцо

Основным изменением для меня стал RewriteBase /бит. К сожалению, я не понимаю, почему это сработало, но я думаю, что скоро узнаю.
Keno Clayton

4

Для тех, кто использует хостинг Firebase, ни один из ответов на этой странице не подойдет. Потому что вы не можете использовать .htaccessна хостинге Firebase. Вам нужно будет настроить файл firebase.json. Просто добавьте строку "cleanUrls": trueв свой файл и сохраните ее. Вот и все.

После добавления строка firebase.json будет выглядеть так:

{
  "hosting": {
    "public": "public",
    "cleanUrls": true, 
    "ignore": [
      "firebase.json",
      "**/.*",
      "**/node_modules/**"
    ]
  }
}

2

Чтобы удалить расширение .html из ваших URL-адресов, вы можете использовать следующий код в root / htaccess:

#mode_rerwrite start here

RewriteEngine On

# does not apply to existing directores, meaning that if the folder exists on server then don't change anything and don't run the rule.

RewriteCond %{REQUEST_FILENAME} !-d

#Check for file in directory with .html extension 

RewriteCond %{REQUEST_FILENAME}\.html !-f

#Here we actually show the page that has .html extension

RewriteRule ^(.*)$ $1.html [NC,L]

Спасибо


-1
RewriteRule /(.+)(\.html)$ /$1 [R=301,L] 

Попробуйте это :) не знаю, работает ли это.


4
Вы не должны публиковать его в качестве ответа, если не уверены, работает он или нет.
Имеет ли значение
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.