Migrando regras de reescrita no subdiretório do Apache para o IIS

1

Na antiga hospedagem do Apache, tínhamos o seguinte arquivo .htaccess dentro de public_html/adm :

<IfModule mod_rewrite.c>
RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . /adm/index.php [L]
</IfModule>

Isso deve redirecionar cada URL após o subdiretório adm para o arquivo /adm/index.php , se o caminho não existir. E funciona muito bem.

Em seguida, migrei este site para o IIS (v8.5) e, usando a ferramenta "Importar regras ...", tentei obter o mesmo efeito, mas no início ele estava mexendo com URLs diferentes daquelas na /adm path. Em uma tentativa de superar isso, eu mudei o arquivo .htaccess original, como abaixo:

<IfModule mod_rewrite.c>
RewriteEngine On
RewriteCond adm/%{REQUEST_FILENAME} !-f
RewriteCond adm/%{REQUEST_FILENAME} !-d
RewriteRule adm/. /adm/index.php [L]
</IfModule>

As regras do IIS resultantes são as seguintes:

<rewrite>
    <rules>
        <rule name="Imported Rule 1" enabled="true" stopProcessing="true">
            <match url="adm/." ignoreCase="false" />
            <conditions logicalGrouping="MatchAll">
                <add input="adm/{REQUEST_FILENAME}" matchType="IsFile" pattern="" ignoreCase="true" negate="true" />
                <add input="adm/{REQUEST_FILENAME}" matchType="IsDirectory" pattern="" ignoreCase="true" negate="true" />
            </conditions>
            <action type="Rewrite" url="/adm/index.php" />
        </rule>
    </rules>
</rewrite>

No começo, parecia funcionar (1), mas rapidamente percebi que os caminhos válidos também estão sendo redirecionados (2). Como pode funcionar corretamente?

  1. http://example.com/aaaa retorna erro 404 e http://example.com/adm/aaaa retorna o conteúdo de http://example.com/adm/index.php (isso é esperado).

  2. http://example.com/adm/images/logo.png , que é um caminho válido, retorna o conteúdo do arquivo index.php (isso equivoca-se).

Este é o resultado das regras de reconfiguração do arquivo web.config .

Obrigado.

    
por Marc.2377 02.03.2016 / 19:56

2 respostas

0

As condições de correspondência não estão sendo atendidas. Isso se deve à adição (errada) de adm/ na frente deles.

O valor da variável de servidor REQUEST_FILENAME é o caminho completo, no sistema de arquivos, do arquivo (ou diretório) que está sendo solicitado. No meu caso de teste específico:

URL de solicitação: http://example.com/adm/images/logo.png
{REQUEST_FILENAME} : F:\IIS\example.com\adm\assets\img\logo.png

Por razões óbvias, anexar adm/ na frente desse valor fará com que seja um caminho de sistema de arquivos inválido e, como resultado, a regra de reescrita será imposta mesmo para arquivos / diretórios válidos. A solução é simples:

Opadrãodefiltragemtambémpodeseratualizadoparaasintaxederegexválida,mesmoqueforadoperfeccionismo,jáqueaetapaanteriorsozinhafoisuficienteparacorrigiroproblemaemquestão.

Regrasatualizadasparaoarquivoweb.configdaseguinteforma.

<rewrite><rules><rulename="Imported Rule 1" enabled="true" stopProcessing="true">
            <match url="(adm\/).*" ignoreCase="false" />
            <conditions logicalGrouping="MatchAll">
                <add input="{REQUEST_FILENAME}" matchType="IsFile" pattern="" ignoreCase="true" negate="true" />
                <add input="{REQUEST_FILENAME}" matchType="IsDirectory" pattern="" ignoreCase="true" negate="true" />
            </conditions>
            <action type="Rewrite" url="/adm/index.php" />
        </rule>
    </rules>
</rewrite>
    
por 04.03.2016 / 09:44
0

Seu regex não está correto. Não corresponde ao valor inteiro após o /

Os resultados de adm/. retornam uma correspondência para adm/i . Portanto, é correto supor que o arquivo não existe.

Você deve regex: adm/.*

Ao criar uma regra na GUI do IIS, clique no botão Test Pattern na seção Match URL para ver os resultados.

    
por 03.03.2016 / 04:59