Así que compré un script del otro tipo (nada lujoso, digamos solo un CMS personalizado) que es un poco complicado y usa frameworks de los que no sé nada excepto nombres como "bootstrap", "laravel" y demás. Soy el tipo que conoce la base y sé algunas cosas desde el nivel intermedio, pero nuevamente, solo algunas, así que cuando veo algunas soluciones sofisticadas, me confundo.

Como aquí: nunca he visto una página construida con archivos con extensiones extrañas y dos archivos .htaccess: uno en la raíz y el segundo en la carpeta / public /. Aún así, a pesar de que hay tantos archivos, todo funciona muy bien y rápido.

Aquí está la descripción del problema:

Entonces, parece que cuando el navegador carga la página (dominio.com), solicita (supongo) contenido de la carpeta / public / y todo funciona bien y el dominio permanece como dominio.com. La cuestión es que domain.com/public también funciona y quiero crear una redirección en esta dirección específica solo para evitar indexar esta dirección de aspecto horrible de domain.com/public, pero teniendo en cuenta que domain.com debería funcionar bien. .

He intentado muchas de las soluciones que se encuentran aquí en SO y en otras páginas, pero resultaron en una página bloqueada (error interno del servidor) o no hicieron nada en absoluto. Creo que algunos de ellos podrían funcionar, pero solo cuando los archivos no están incrustados en otra subcarpeta. Eh, no sé, se me acabaron las ideas. ¿Podrías ayudarme?

Aquí está el .httaccess de la raíz

RewriteEngine On

RewriteCond %{THE_REQUEST} /public/([^\s?]*) [NC]
RewriteRule ^ %1 [L,NE,R=302]

RewriteRule ^((?!public/).*)$ public/$1 [L,NC]

Y aquí está el public / .htaccess

<IfModule mod_rewrite.c>
<IfModule mod_negotiation.c>
    Options -MultiViews
</IfModule>

RewriteEngine On

# Redirect Trailing Slashes If Not A Folder...
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)/$ /$1 [L,R=301]

# Handle Front Controller...
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^ index.php [L]
</IfModule>
0
Mateusz Osuch 4 dic. 2016 a las 08:41

1 respuesta

La mejor respuesta

Me parece que lo que tienes debería funcionar, específicamente la primera condición + regla en la raíz .htaccess está destinada a hacer lo que estás pidiendo. Lo puliría un poco:

En /.htaccess:

RewriteEngine On
RewriteBase /
# Fix URLs that begin with "public" subdirectory
RewriteCond %{THE_REQUEST} \s/public(?:/(\S*))?\s
RewriteRule ^ %1 [NS,NE,R=301,END]
# Internally rewrite everything else
RewriteRule ^(?!public/).* public/$0 [DPI,L]

En /public/.htaccess:

<IfModule mod_rewrite.c>
    <IfModule mod_negotiation.c>
        Options -MultiViews
    </IfModule>

    RewriteEngine On
    # Pretend this is the root
    RewriteBase /
    # Redirect trailing slashes if not a folder
    RewriteCond %{REQUEST_FILENAME} !-d
    RewriteRule ^(.*)/$ $1 [DPI,R=301,END]
    # Handle front controller
    RewriteCond %{REQUEST_FILENAME} !-d
    RewriteCond %{REQUEST_FILENAME} !-f
    RewriteRule ^(?!index\.php$). index.php [DPI,END]
</IfModule>

Puede usar L en lugar de END si su versión de Apache es antigua, lo sabrá debido a un error 500.

0
Walf 4 dic. 2016 a las 16:27
Gracias Walf por tu disposición a ayudar. Sin embargo, su código no hizo nada, domain.com/public todavía se carga y no redirige a domain.com ... ¿Sabes por qué?
 – 
Mateusz Osuch
5 dic. 2016 a las 16:46
No ha dicho si se cargan otras páginas. ¿Qué sucede si pones una línea de texto aleatorio sin sentido al principio de tu raíz .htaccess? Si no obtiene un error, es posible que sus reglas no se estén utilizando en absoluto.
 – 
Walf
6 dic. 2016 a las 02:13