Как мне реализовать перезапись 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

Сначала убедитесь, что в apache есть модуль и что он разрешен в файлах .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 и поместите его в каталог под названием «course-compilers». Затем, когда вы указываете на этот каталог, индекс обслуживается по умолчанию, но не будет отображаться в URL. Так что вы можете просто написать свои ссылки как «labourseur.com/course-compilers», и все будет хорошо.

Нет .htaccess требуется.

Джоэл Гловье
источник