Як здійснити перезапис URL-адрес у своєму файлі .htaccess?


17

Я хотів би зробити кілька перезаписів URL-адрес (чому? Дивіться це запитання .), Щоб замість того, щоб користувачі бачили такі адреси

labouseur.com/course-compilers.html 

замість цього вони можуть просто бачити та використовувати

labouseur.com/course-compilers

(Ще краще, можливо, я маю переструктурувати це так, щоб це були курси / компілятори.)

Я використовую службу спільного хостингу на базі Linux для свого веб-сайту, тому у мене немає адміністративного контролю над сервером, але я маю контроль над .htaccess. Посилання, які я читав в Інтернеті, здалися мені менш зрозумілими, тому тут я шукаю трохи ясності та порад.


Зауважте, що це не те, що ви робите лише у налаштуваннях сервера (.htaccess). Важливим першим кроком є ​​фактична зміна URL-адрес у вашій програмі, інакше у вас виникне маса непотрібних переадресацій (або дублювання вмісту).
MrWhite

Відповіді:


13

Ви фактично можете видалити .html з файлів на вашому сервері та встановити налаштування в htaccess, щоб вони отримували сервіси як HTML-файли, але це, мабуть, не те, що ви шукаєте.

Зробити це :

RewriteEngine on
# Check this condition to ensure that it's not a directory.
RewriteCond %{REQUEST_FILENAME} !-d
# Check this condition to ensure that there's a file there
RewriteCond %{REQUEST_FILENAME}\.html -f
# Replace html with your file extension, eg: php, htm, asp
RewriteRule ^(.*)$ $1.html

Тут є більш складнощі, особливо якщо ви турбуєтесь про проблеми, що повторюються із вмістом. З правилом вище, ваші сторінки все ще будуть доступні зі старих URL-адрес.
JasonBirch

3

Спочатку переконайтеся, що у апачі є модуль і що він дозволений у файлах .htacces, а потім додайте:

RewriteEngine on

# Rewrite rules
RewriteRule ^/myoldsubfolder/(.*) /newfolder/$1 

Ваш приклад зажадає

RewriteCond %{REQUEST_URI} !-d
RewriteCond %{REQUEST_URI}\.html -f
RewriteRule ^/(([a-zA-Z0-9_]+)/?)$ /$1.html

Для однорівневої структури каталогів і

RewriteRule ^/(([a-zA-Z0-9_]+)/?)+$ /$1.html

Для багаторівневої структури.

Але будьте обережні

Якщо у вас є структура

/site/.htaccess
/site/subfolder/.htaccess
/site/subfolder/cats/.htaccess

Правила перезапису в дочірні .htaccessфайли будуть відносно їх батьківської папки, і ви можете потрапити в деякі безладні ситуації циклу перезапису. Переконайтесь, що ви використовуєте, RewriteCondщоб зупинити їх, якщо можете!


Ви не заперечуєте детальніше про останній пункт (використовуючи RewriteCond для зупинки циклів)?
Травіс Нортчетт

2

Крім вищезазначених відповідей можна використовувати

RewriteEngine on
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME}\.html -f
RewriteRule ^([\w-]+)$ $1.html [L]

([\w-]+) Дозволяє букви, цифри з дефісом (-).

(.*) буде переписати кожен запит незалежно, що може виявити безсилі інші правила, що викликають внутрішню помилку сервера при доступі.


Ваш RewriteRule шаблон є вдосконаленням порівняно з прийнятою відповіддю для конкретного прикладу, наведеного у питанні, однак він не зможе відповідати більш загальному випадку, коли є більше одного сегмента шляху, наприклад. /path/to/course-compilers. Включіть Lпрапор, щоб зменшити вплив на наступні правила. Незважаючи на те, що (.*)шаблон є загальновизнаним, він навряд чи спричинить серйозні проблеми через умову, що перевіряє файл.
MrWhite

1

Для цього вам не потрібно використовувати .htaccess файл. Просто структуруйте свої файли в каталогах, а замість того, щоб використовувати "labouseur.com/course-compilers.html", просто назвіть файл index.html і покладіть його в каталог під назвою "компілятори курсу". Тоді, коли ви вказуєте на цей каталог, індекс подається за замовчуванням, але не відображатиметься в URL-адресі. Так що ви можете просто написати свої посилання як "labourseur.com/course-compilers", і все буде добре.

Не потрібен .htaccess.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.