.htaccess, corretta riscrittura di directory e file con lo stesso nome

A partire da ora il mio sito web ha alcune pagine statiche, una delle quali è / portfolio. Tra le altre cose, il mio htaccess nasconde l’estensione .html. Mi piacerebbe aggiungere una directory di portfolio, ma non voglio spostare la mia pagina portfolio esistente nella directory portfolio come il file indice predefinito. La mia pagina / portfolio è uno dei miei sitelink di Google e temo che se viene spostata o se l’URL cambierà in qualche modo, Google la considererà una pagina completamente nuova.

Il mio problema è una volta che aggiungo la cartella / portfolio /, ogni volta che provo a visitare la pagina originale / portfolio, una barra finale viene aggiunta automaticamente e si collega alla directory stessa.

Ho provato innumerevoli opzioni, una delle quali è una riscrittura di / portfolio / to / portfolio, tuttavia questo crea un ciclo infinito. Ho anche provato “DirectorySlash Off” ma ho rimosso solo la barra finale mentre si trovava all’interno della directory, ma non ha ripristinato l’accesso alla pagina originale / portfolio.

In fin dei conti, vorrei mantenere la mia pagina portfolio così com’è, collegando le pagine all’interno della directory come / portfolio / example e se si accede a / portfolio o / portfolio / si vedrà la stessa pagina che è al di fuori di la directory senza Google che pensa che sia un contenuto duplicato.

Una domanda simile esiste qui: .htaccess riscrivendo l’url in una pagina o in una directory, anche se questo mi ha comunque causato un ciclo infinito per qualche motivo, suppongo che abbia qualcosa a che fare con le estensioni nascoste.

Ecco il mio htaccess-

 RewriteEngine On

 # HTML a PHP
 RemoveHandler .html .htm
 AddType application / x-httpd-php .htm .html

 # Nascondi estensione
 RewriteCond% {REQUEST_FILENAME}! -D
 RewriteCond% {REQUEST_FILENAME} \. Html -f
 RewriteRule ^ (. *) $ $ 1.html

 # Forza WWW
 RewriteCond% {HTTP_HOST} ^ mydomain \ .net
 RewriteRule ^ (. *) $ Http://www.mydomain.net/$1 [R = 301, L]

 # Sottodominio blog
 RewriteCond% {HTTP_HOST} ^ blog.mydomain.net $
 RewriteRule ^ (. *) $ Http://www.mydomain.net/blog/$1 [R = 301, L]

So che non è una buona idea avere una directory con lo stesso nome di una pagina statica, ma preferirei non modificare la pagina esistente e perdere il sitelink di Google, quindi un modo pulito e appropriato per gestirlo sarebbe di aiuto.

Ci sono due cose che vanno “male” qui, e due modi per risolverlo.

Il primo è che apache “scopre” che esiste una directory con il nome di “portfolio” prima che vengano applicate le condizioni di riscrittura. Ciò significa che le condizioni di riscrittura stanno ricevendo “portfolio /” anziché “portfolio”.

In secondo luogo, la regola “! -D” evita in modo specifico la riscrittura che si desidera creare se esiste effettivamente una directory con quel nome

Soluzione 1: redirect manualmente le richieste per la directory del portfolio per rimuovere la barra.

# Manually re-route portfolio/ requests to portfolio RewriteCond %{REQUEST_FILENAME} portfolio/$ RewriteRule ^(.*)/$ $1 # Hide extension RewriteCond %{REQUEST_FILENAME}\.html -f RewriteRule ^(.*)$ $1.html 

Notare la rimozione della condizione “! -D”.

Lo svantaggio di questo è che devi codificare il caso del bordo “portfolio” direttamente nelle regole di riscrittura e il browser verrà reindirizzato al portfolio /

Soluzione 2: impostare DirectorySlash Off e rimuovere il test della directory esistente

 # Disable Automatic Directory detection DirectorySlash Off # Hide extension RewriteCond %{REQUEST_FILENAME}\.html -f RewriteRule ^(.*)$ $1.html 

L’impostazione di DirectorySlash Off risolverà questo problema nel modo migliore, ma potrebbe interrompere altre parti del tuo sito in cui desideri effettivamente l’uso di DirectorySlash. Il meglio della fortuna, e spero che questo aiuti.

Nota quando testare la soluzione 2, il tuo browser potrebbe ricordare il reindirizzamento di “portfolio” a “portfolio /” ed eseguire il reindirizzamento prima ancora di inviare la richiesta al server. Assicurati di eseguire il test in un ambiente pulito e privo di cache per ottenere i migliori risultati.