mod_rewrite для удаления .html из адресной строки без изменения ссылок в html-файле - PullRequest
0 голосов
/ 09 марта 2019

Первый вопрос. Итак, у меня есть простой сайт «website.com» на Apache:

website.com
    index.html
    site1.html
    site2.html

В каждом html у меня есть ссылки на другие, в этой форме:

<a href="index.html">main</a>
<a href="site1.html">site1</a>
<a href="site2.html">site2</a>

Я хочу, чтобы браузер отображал "website.com/site1" вместо "website.com/site1.html".

Я играл с ней несколько дней и всегда получаю один из следующих результатов:

  1. Бесконечный цикл перенаправлений.
  2. Внутренняя ошибка сервера.
  3. Обе версии работают (например, "website.com/site1.html" и "website.com/site1"), но .html остается в адресной строке.

Я не знаю, что происходит. Я даже не могу сломать это должным образом. Например, я ожидал, что этот .htaccess выдаст ошибку при доступе к «website.com/site1», потому что нет правила перенаправления site1 на site1.html:

RewriteEngine on

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

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

Но нет - работает, просто не удаляет .html в адресной строке.

Как Apache знает, как перенаправить "website.com/site1" на "website.com/site1.html" без соответствующего RewriteRule для него? Мое понимание неверно, что я должен перенаправить с website.com/site1 на website.com/site1.html, чтобы это работало?

Заранее спасибо.

1 Ответ

0 голосов
/ 09 марта 2019

Последняя строка в ваших правилах:

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

Это означает, что нужно изменить любой file.html на file, и вам нужно только принять file только перенаправить его внутренне на file.html вот так:

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

Но в этом случае file.html будет таким, как есть, если вы хотите удалить .html, попробуйте следующие правила:

RewriteEngine on 
RewriteCond %{THE_REQUEST} \s/+(.*)\.html[\s?/] [NC]
RewriteRule ^  /%1 [R=301,L,NE]

RewriteCond %{REQUEST_FILENAME}   !-f 
RewriteCond %{REQUEST_FILENAME}\.html -f
RewriteRule ^(.*)$ /$1.html [L]

Первые две строки после RewriteEngine on удаляют .html.

Остальные строки проверят, является ли запрос без расширения файлом .html или нет, если он принят .htmlбудет перенаправлен, но внутри.

Теперь оба, site1.html или site1 будут site1 в браузере.

Таким образом, вы убедитесь, что файл принимает .htmlрасширение перед перенаправлением, и это разделит этот этап смешивания с файлами ошибок.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...