Parte de strip do Apache ModRewrite de request_uri em rewriteCondition

1

então, basicamente, eu tenho um link no meu html domain.com/app/css/build/app-23471942834.css , no entanto, no servidor, o arquivo realmente vive em /fs/current/public/css/build/app-23471942834.css . Existe uma maneira de verificar se existe um arquivo em RewriteCondition ? O problema é que eu basicamente preciso da parte /css/build/app-23471942834.css para verificar, sem o /app . Existe uma maneira de remover isso em uma condição?

Então eu preciso:

  • domain.com/app/login a ser reescrito para /fs/current/public/login
  • domain.com/app/build/css/app-123523.css a ser reescrito para /fs/current/public/build/css/app-123523.css
  • domain.com/app/build/js/app-123523.js a ser reescrito para /fs/current/public/build/js/build/app-123523.css

Estou usando o Laravel, portanto, dentro do meu diretório public , há outro .htaccess por padrão:

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

    # Handle Authorization Header
    RewriteCond %{HTTP:Authorization} .
    RewriteRule .* - [E=HTTP_AUTHORIZATION:%{HTTP:Authorization}]
</IfModule>

Desculpe, mas eu realmente sou péssimo nos arquivos do htaccess. Obrigado pela sua ajuda.

O que eu tenho até agora:

RewriteCond %{HTTP_HOST} ^(www.)?domain.de$ [NC]
RewriteCond %{DOCUMENT_ROOT}/fs/current/public/$1 -f
RewriteRule ^app/(.*)$ /fs/current/public/$1 [L]

RewriteCond %{HTTP_HOST} ^(www.)?domain.de$ [NC]
RewriteRule ^app/(.*)$ /fs/current/public/index.php?/$1 [L]

SOLUÇÃO:

Eu resolvi meu problema assim:

RewriteCond %{HTTP_HOST} ^(www.)?domain.de$ [NC]
RewriteCond %{REQUEST_URI} \.(css|jpg|gif|png|js|svg)
RewriteRule ^app/(.+)$ /fs/current/public/$1 [L]

Então toda a reescrita só se aplica ao css / jpg / gif / png / js / svg Eu acho que o problema que eu tinha antes, era que o arquivo index.php também foi reescrito pelo script.

    
por Lukas Oppermann 18.07.2016 / 15:21

1 resposta

1

Tente o seguinte:

RewriteEngine On
RewriteRule ^/?app/(css/build/app)-\d+(\.css)$ /fs/current/public/$1$2 [L]

Não sei exatamente o que você procura, mas isso reescreverá internamente uma URL do formulário domain.com/app/css/build/app-23471942834.css to /fs/current/public/css/build/app.css .

Se você precisar verificar se o arquivo de destino existe antes de reescrevê-lo, adicione uma condição antes do RewriteRule (embora não saiba por que você precisaria fazer isso, como você vai ter um 404, independentemente). Por exemplo:

RewriteCond %{DOCUMENT_ROOT}/fs/current/public/$1$2 -f

UPDATE # 1: dos comentários ...

I would need to rewrite anything that is not a file

Ah ok, isso faz mais sentido. Você pode substituir a diretiva RewriteCond acima por:

RewriteCond %{REQUEST_FILENAME} !-f

Isso só processará a seguinte substituição RewriteRule se a URL solicitada não corresponder a um arquivo no sistema de arquivos.

UPDATE # 2: da pergunta atualizada ...

Uma solução mais geral, depois da diretiva RewriteEngine existente, tente o seguinte em .htaccess:

RewriteCond %{DOCUMENT_ROOT}/fs/current/public/$1 -f
RewriteRule ^app/(.+)$ /fs/current/public/$1 [L]

Isso só reescreverá a solicitação se um arquivo com o formato <document-root>/fs/current/public/css/build/app-23471942834.css ou <document-root>/fs/current/public/login existir no sistema de arquivos.

    
por 18.07.2016 / 15:50