htaccess перенаправляет все страницы, заканчивающиеся на .html, на без html, за исключением некоторых страниц

#.htaccess #redirect

#.htaccess #перенаправление

Вопрос:

У меня проблема с моими .htaccess правилами перенаправления.

Мне нужно перенаправить страницы, заканчивающиеся на .html , на страницы, заканчивающиеся косой чертой.
/about-us.html Для /about-us/

Но есть также страницы, где мне нужно перенаправить на определенную страницу без .html подобного
/gallery/first-gallery/this-is-the-gallery.html Для /gallery/new/

Проблема в том, что мои правила плохо работают вместе, кажется, что правило перенаправления html-страниц игнорирует все остальные правила.

Вот как выглядит мой .htaccess

 <IfModule mod_rewrite.c>
RewriteEngine on
RewriteRule ^/?(.*).(html)$ /$1 [R=301,L]
Redirect 301 /about-us/photo-gallery/17577-album-mca-corona-clay-tile-roof-princeton-texas/131173-58e29f485064eprinceton-texas-roofing-services-1.html /about-us/photo-gallery/17577-album-mca-corona-clay-tile-roof-princeton-texas/
Redirect 301 /about-us/photo-gallery/17577-album-mca-corona-clay-tile-roof-princeton-texas/131174-58e2a063b8b06princeton-texas-roofing-services-2.html /about-us/photo-gallery/17577-album-mca-corona-clay-tile-roof-princeton-texas/
#Many other 301 rules below
</IfModule>
  

Поэтому, когда я набираю
domain.com/about-us/photo-gallery/17577-album-mca-corona-clay-tile-roof-princeton-texas/131173-58e29f485064eprinceton-texas-roofing-services-1.html
в браузере он перенаправляет на
domain.com/about-us/photo-gallery/17577-album-mca-corona-clay-tile-roof-princeton-texas/131173-58e29f485064eprinceton-texas-roofing-services-1
куда мне нужно перенаправить это конкретное перенаправление
/about-us/photo-gallery/17577-album-mca-corona-clay-tile-roof-princeton-texas/

Я попытался переместить RewriteRule ^/?(.*).(html)$ /$1 [R=301,L] в самый низ, надеясь, что приведенные выше правила будут обработаны первыми, но это не сработало.

Что я могу сделать, чтобы это работало так, как мне нужно?

Ответ №1:

Прежде всего, если есть mod_alias подобные redirect и mod_rewrite подобные RewriteRule mod_rewrite правила выполняются перед mod_alias правилами.

Есть много способов решить эту проблему, например, исключить все другие правила перенаправления из основного rewriterule, но я думаю, что если другие правила redirect имеют ту же цель, чтобы пропустить только последнюю часть URI, вы могли бы создать правила, подобные следующему :

 <IfModule mod_rewrite.c>
RewriteEngine on
RewriteRule ^([^/] )/([^/] )/([^/] )/([^/] ).(html)$ /$1/$2/$3 [R=301,L]
RewriteRule ^(.*).(html)$ /$1 [R=301,L]
</IfModule>
  

Приведенные выше правила проверят, URI поступает ли оно в таком /something/something/something/something.html виде /about-us/photo-gallery/17577-album-mca-corona-clay-tile-roof-princeton-texas/131173-58e29f485064eprinceton-texas-roofing-services-1.html , затем перенаправят его в /something/something/something , и если оно поступает не таким образом, будет применено второе правило.

Примечание: очистите кэш браузера, затем протестируйте