Удаление косой черты и перенаправление html

У меня проблема в том, что первый URL работает, а второй нет.

http://www.example.com/podcast/episode1
http://www.example.com/podcast/episode1/

Есть ли способ перенаправить все версии с завершающей косой чертой на версию без косой черты?

Здесь проблема еще хуже, поскольку ни один из них не работает:

пример.com/подкаст
пример.com/подкаст/

Работает только этот:

example.com/podcast.html

и я не хочу, чтобы расширение html было видно.

Вот код, который у меня есть в моем файле .htaccess:

#shtml

AddType text/html .html
AddHandler server-parsed .html

#html

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

#index redirect

RewriteCond %{THE_REQUEST} ^[A-Z]{3,9}\ /index\.html\ HTTP/ 
RewriteRule ^index\.html$ http://example.com/ [R=301,L]

#non www to www

RewriteEngine On
RewriteCond %{HTTP_HOST} !^www\.
RewriteRule ^(.*)$ http://www.%{HTTP_HOST}/$1 [R=301,L]

Можете ли вы помочь мне?


person Jeremy    schedule 30.06.2012    source источник
comment
Также нужно перенаправить html-версию на не-html-версию. Например, я хочу, чтобы pavlinaplus.com/podcast/reality.html перенаправлял на pavlinaplus.com/podcast/reality   -  person Jeremy    schedule 30.06.2012


Ответы (1)


Удалить завершающую косую черту легко. Удаление .html — нет.

Удаление косой черты

Просто перенаправьте R = 301, если вы видите там косую черту.

RewriteRule ^(.*)/$ $1 [R=301]

Не добавляйте флаг L, так как вы хотите продолжить обработку этого запроса. Также сделайте это первым правилом.

Почему нельзя удалить .html

Ваша проблема заключается в том, что как только page становится page.html (через внутреннюю переадресацию), на сервер отправляется новый запрос на page.html. Тогда ваш .htaccess увидит запрос на page.html и перенаправит на page. Cue бесконечный цикл.

Оптимизация вашего кода

  1. Вам нужно только RewriteEngine On один раз в верхней части .htaccess
  2. Вам следует добавить перенаправление www в начало кода и удалить флаг L (см. Удаление косой черты).
person Scott Stevens    schedule 30.06.2012
comment
Привет, Скотт, спасибо за помощь. Код частично работает, частично нет. Посетите версию с косой чертой в конце, чтобы узнать, что происходит (версия без косой черты по-прежнему работает). Любая идея, что может заставить его пойти по длинному маршруту? - person Jeremy; 01.07.2012
comment
Как избавиться от части URL home/theev8/public_html/? - person Jeremy; 01.07.2012
comment
Это проблема с вашим RewriteBase. Вы можете установить его на /, что должно решить проблему — под RewriteEngine On добавьте RewriteBase /. Это изменяет путь перезаписи — Документация Apache Mod_Rewrite - person Scott Stevens; 01.07.2012
comment
Теперь он говорит мне, что у меня слишком много перенаправлений. Хм. http://www.pavlinaplus.com/podcast/ - person Jeremy; 01.07.2012
comment
Вот зеркальное отображение моего файла .htaccess {link} - person Jeremy; 01.07.2012
comment
Я установил, что причиной проблемы является RewriteRule, относящийся к %{REQUEST_FILENAME} !-f. Цикл не возникает из-за ошибки 404. Я изучаю это. Изменить: Хм... pavlinaplus.com/htaccess не вызывает этой проблемы. Только /podcasts и /newsletter вызывают эту проблему. Это папки, и есть ли /podcasts.html и /newsletter.html? - person Scott Stevens; 01.07.2012
comment
Это папки и html-файлы, поэтому я могу предположить, что это может быть проблемой (подкаст.html существует в банкомате, информационный бюллетень.html еще не создан) - person Jeremy; 01.07.2012
comment
И я действительно не хочу делать имена папок разными; идея состоит в том, что люди могут удалить часть URL-адреса и, так сказать, создать резервную копию на другой странице. - person Jeremy; 02.07.2012
comment
Я думаю, проблема в том, что они являются каталогами, я предполагаю, что удаление / приводит к его повторному добавлению (поскольку это каталог), и он быстро удаляет его снова и так далее. В данный момент у меня не так много времени для себя, но я не смог воспроизвести это на своем локальном компьютере (однако стоит отметить, что он продолжал ставить косую черту перед перенаправлением на страницу .html) . Ваш лучший вариант, вероятно, состоит в том, чтобы поместить index.html в папку и получить доступ к /foldername.html таким образом, или добавить RewriteCond %{REQUEST_FILENAME} !-d в правило удаления косой черты. - person Scott Stevens; 03.07.2012
comment
У меня не так много каталогов, есть всего несколько страниц, таких как страница подкаста. Есть ли способ вручную перенаправить pavlinaplus.com/podcast на .../podcast.html а затем я использую тот же тип кода для других нескольких страниц? - person Jeremy; 03.07.2012
comment
Я попробовал ваш метод каталога index.html, и он работает очень хорошо, поэтому я буду придерживаться его. Итак, теперь я могу получить доступ к своей странице, перейдя по адресу: /podcast/. Правильно ли сказать, что, вероятно, ни один браузер не отобразит настоящее имя файла (index.html)? - person Jeremy; 03.07.2012
comment
Именно сервер ищет index.html, поэтому браузер никогда его не покажет. Однако он подпадает под ту же категорию, что и другие html-страницы — вы не можете перенаправить их, если они переходят непосредственно к index.html в браузере (хотя я не знаю, как Apache ищет index.html, вы может быть в состоянии перенаправить прочь). - person Scott Stevens; 04.07.2012
comment
По какой-то причине этот URL-адрес не работает, когда я ввожу его с косой чертой в конце. http://www.pavlinaplus.com/newsletter/checklist/ Все остальные URL-адреса перенаправляются нормально хотя и с косой чертой в конце. - person Jeremy; 04.07.2012
comment
Это удаляет его для меня. Может ли быть проблема с кэшированием? - person Scott Stevens; 05.07.2012
comment
Уважаемый Скотт, не могли бы вы решить мою проблему с косой чертой в конце? stackoverflow .com/questions/41608615/ - person Immran Mohammed; 17.01.2017