Як видалити .html з URL-адреси?


112

Як видалити .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, так і для SEO.
Дейв


@Tomalak: Дякую за поради. Читання документації mod_rewrite було дуже корисним.
Дейв

Відповіді:


105

Я думаю, що якесь пояснення відповіді Йона було б конструктивним. Наступне:

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


6
Чудова діаграма, яка допоможе пояснити відповідь.
Рік

Порада щодо 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
Жодна з інших відповідей не працювала для мене, але ця зробила, велике спасибі!
Еммет Арріс

2
цей теж працював на мене. Дякую @starkeen Майте ^ голос.
JeremyS

2
Працював ідеально чудово. Дякую!
ixany

це видаляє розширення для мене, але не перенаправляє на цю сторінку
Bhargav Venkatesh

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
Це нічого не робить для мене. Чи є якась причина, що це не працює?
Михайло Яворський

У вас є фактичний файл для запитуваного посилання? Це призведе до!-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

Я спробував це зробити в localhost, але він не працює, чи є мені ще щось, що мені потрібно зробити, чи потрібно мені посилати файл .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. Ключ - Параметри -MultiViews
Бред Вандербуш

Так, нічого в цьому розділі не очікує на цю відповідь! Ти врятував день!
Ніл Банет

Дякую, друже. Я не впевнений, чому інші не спрацювали так, як очікувалося.
Наноо

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 екстанції зі свого URL-адреси, переконайтесь, що це правильний код:

    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 /біт. На жаль, я не розумію, чому це спрацювало, але, мабуть, незабаром я навчусь.
Кено Клейтон,

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.