Vzhľadom na štruktúru súborov:
|- .htaccess (1)
|- portfolio.html
|- portfolio(dir) -|
|- .htaccess (2)
Chcel by som prepísať akýkoľvek odkaz s / portfóliom do /portfolio.html. Problémom je, že existuje aj adresár s názvom portfólio.
Táto otázka je veľmi podobná tej, ktorá tu odpovedá:
.htaccess, správne prepisovanie adresára a súboru s rovnakým názvom
Ale bohužiaľ to mi pomerne nevyrieši problém.
Tu sú navrhnuté riešenia pre prijatú odpoveď na vyššie uvedený odkaz:
Riešenie 1: Ručné presmerovanie žiadostí o adresár portfólia na odstránenie lomítka.
# Manually re-route portfolio/ requests to portfolio
RewriteCond %{REQUEST_FILENAME} portfolio/$
RewriteRule ^(.*)/$ $1
# Hide extension
RewriteCond %{REQUEST_FILENAME}.html -f
RewriteRule ^(.*)$ $1.html
Nevýhodou tohto problému je, že musíte pevne označiť okrajový prípad "portfólia" priamo do pravidiel prepisovania a stále bude mať za následok, že prehliadač bude najprv presmerovaný na portfólio /
Riešenie 2: Nastaviť DirectorySlash Vypnúť a odstrániť adresár existuje test
# Disable Automatic Directory detection
DirectorySlash Off
# Hide extension
RewriteCond %{REQUEST_FILENAME}.html -f
RewriteRule ^(.*)$ $1.html
Nastavenie zoznamu vypnutých adresárov by tento problém vyriešil najlepšie, ale môže rozbiť ďalšie časti vašej lokality, kde skutočne chcete Auto DirectorySlash.
A naozaj odpoveď na vyššie spomenutý stackoverflow answer rieši problém, ale iba v prípade, že neexistuje žiadne pravidlo .htaccess v adresári s rovnakým názvom ako názov súboru, t. j. akýkoľvek rewriteRule v súbore .htacess (2), ktorý je zobrazený vyššie, zastaví túto prácu.
Môže niekto navrhnúť spôsob, ako to dosiahnuť? Vďaka
odpovede:
1 pre odpoveď č. 1Toto pravidlo by malo pracovať pre vás z vášho htaccess (2)
:
RewriteEngine On
RewriteCond %{REQUEST_URI}::$1 ^(.*?)/(.*)::2$
RewriteRule ^(.*)$ - [E=BASE:%1]
# if .html exists then use it
RewriteCond %{DOCUMENT_ROOT}%{ENV:BASE}.html -f [NC]
RewriteRule ^$ /%{ENV:BASE}.html [L]