/ / .htaccess, prepisovanie názvu súboru s rovnakým názvom ako adresár - regex, apache, .htaccess, mod-rewrite

.htaccess, prepisovanie názvu súboru s rovnakým názvom ako adresár - regex, apache, .htaccess, mod-rewrite

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ď č. 1

Toto 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]