Eu tenho a seguinte estrutura para os códigos do meu site em/var/www/html
-- files
---- test.txt
-- app
---- SomePhpCodes.php
---- SomePhpCodes.php
-- public
---- index.php
---- .htaccess
A raiz do documento está definida como "/var/www/html/public", mas também quero que os arquivos sejam acessíveis pelo caminho "http://mywebsite/files/test.txt".
Acho que isso deve ser possível usando mod_rewrite no .htaccess
arquivo interno public
, mas estou lutando para fazer isso.
Tentei adicionar uma regra ao padrão .htaccess
que é fornecido pelo framework Laravel. A corrente .htaccess
se parece com o seguinte:
<IfModule mod_rewrite.c>
<IfModule mod_negotiation.c>
Options -MultiViews -Indexes
</IfModule>
RewriteEngine On
# Handle Authorization Header
RewriteCond %{HTTP:Authorization} .
RewriteRule .* - [E=HTTP_AUTHORIZATION:%{HTTP:Authorization}]
# Redirect Trailing Slashes If Not A Folder...
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_URI} (.+)/$
RewriteRule ^ %1 [L,R=301]
# The following rule is added by me
RewriteRule files/(.*\.txt) /var/www/html/files/$1 [L]
# Send Requests To Front Controller...
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^ index.php [L]
</IfModule>
O resultado atual é Internal Server Error
ao tentar acessar "http://mywebsite/files/test.txt". Tenho a sensação de que posso ter perdido algumas configurações para tornar a pasta "arquivos" pública, mas não tenho ideia de como fazê-lo.
Estou travado e se alguém puder me ajudar eu agradeço.
Você pode criar um link simbólico
Você vai precisar
Options +FollowSymLinks
para que isso funcione. Observe que esta opção adiciona um risco de segurança, pois permite acessar arquivos fora doDocumentRoot
.Alternativamente, você pode adicionar
Alias /files /var/www/html/files
à suaVirtualHost
configuração para este site. É uma opção mais segura, mas você não pode fazer isso com.htaccess
.Além da resposta do @AlexD...
Isso é possível usando mod_rewrite, mas não em
.htaccess
. Você precisaria fazer isso diretamente na configuração do servidor principal (ou contêiner VirtualHost).Em um contexto de diretório (ou
.htaccess
) você está restrito a reescrever apenas para um caminho de URL. No entanto, em um contexto de servidor (ou virtualhost ), você pode reescrever para um caminho de URL ou um caminho absoluto do sistema de arquivos.No entanto, esta não é a causa do seu
Internal Server Error
...Isso provavelmente está resultando em um loop de reescrita (daí a resposta 500 Internal Server Error) porque o
RewriteRule
padrão não ancorado também corresponde à string de substituição (um caminho de URL relativo à raiz) e, portanto, o caminho de URL reescrito é reescrito várias vezes. .Em um contexto de servidor , você pode escrever assim:
(Se você não espera subdiretórios do
/files
diretório, o regex deve ser mais restritivo, por exemplo.([^/]+\.txt)
)