Mod_rewrite está ignorando a extensão de um arquivo

1

Esta é toda a minha condição de mod_rewrite:

<IfModule mod_rewrite.c>
   <Directory /var/www/>
    Options FollowSymLinks -Multiviews
    AllowOverride None
    Order allow,deny
    allow from all

    RewriteEngine On

    # force www. (also does the IP thing)
    RewriteCond %{HTTPS} !=on
    RewriteCond %{HTTP_HOST} !^mysite\.com [NC]
    RewriteRule ^(.*)$ http://mysite.com/$1 [R=301,L]

    RewriteCond %{REQUEST_URI} ^system.*
    RewriteRule ^(.*)$ /index.php?/$1 [L]   
    RewriteCond %{REQUEST_URI} ^application.*
    RewriteRule ^(.*)$ /index.php?/$1 [L]

    RewriteCond %{REQUEST_FILENAME} !-f
    RewriteCond %{REQUEST_FILENAME} !-d
    RewriteRule ^(.+)\.(\d+)\.(js|css|png|jpg|gif)$ $1.$3 [L]

    RewriteCond %{THE_REQUEST} /index\.(php|html)
    RewriteRule (.*)index\.(php|html)(.*)$ /$1$3 [r=301,L]

    RewriteCond %{REQUEST_URI} !^(/index\.php|/assets|/robots\.txt|/sitemap\.xml|/favicon\.ico)
    RewriteRule ^(.*)$ /index.php/$1 [L]

    # Block access to "hidden" directories or files whose names begin with a period. This
    # includes directories used by version control systems such as Subversion or Git.
    RewriteCond %{SCRIPT_FILENAME} -d [OR]
    RewriteCond %{SCRIPT_FILENAME} -f
    RewriteRule "(^|/)\." - [F]
   </Directory>
</IfModule>

Supõe-se permitir somente o acesso a meusite.com (/index.php|/assets|/robots.txt|/sitemap.xml|/favicon.ico)

O erro foi observado com: mysite.com/sitemap vs mysite.com/sitemap.xml Ambos os endereços estão resolvendo para o arquivo xml enquanto o primeiro url deve estar resolvido para mysite.com/index.php/sitemap ***

Por alguma razão, o mod_rewrite está ignorando completamente a falta de uma extensão. Soou como um problema do Multiviews, então eu desabilitei o Multiviews e ainda está acontecendo.

*** E então uma regra diferente acabará por tirar o index.php, estou tendo outro problema com um '/' extra sendo deixado para trás quando isso acontecer.

Este arquivo httpd está sendo configurado para o meu framework codeigniter php

Resposta: Bem, eu encontrei o problema, acontece que mesmo que eu tenha desativado o Multiviews no meu arquivo httpd.conf, eles ainda estavam habilitados no / etc / apache2 / sites-available / default e também no / etc / apache2 / sites-available / default-ssl

    
por ngl5000 05.06.2012 / 02:40

1 resposta

1

Este par:

RewriteCond %{REQUEST_URI} !^(/index\.php|/assets|/robots\.txt|/sitemap\.xml|/favicon\.ico)
RewriteRule ^(.*)$ /index.php/$1 [L]

Trate os dois URIs de maneira diferente. /sitemap.xml não corresponde ao RewriteCond e é passado para o sistema de arquivos. /sitemap corresponde ao RewriteCond e é reescrito para /index.php/sitemap .

A pergunta é: o que seu aplicativo faz com esse URI? Se encontrar o arquivo sitemap.xml e o servir, isso explicaria o comportamento que você está vendo.

Eu realmente não consigo ver como essas reescritas poderiam veicular /sitemap.xml quando a solicitação era /sitemap . Uma maneira de verificar se a solicitação está sendo executada ou não no seu aplicativo é criar um novo arquivo de registro e configurar seu aplicativo para acrescentar uma linha para cada solicitação que inclua a data, o URI da solicitação e o que ela planeja exibir (ou de que módulo está executando o código).

Você pode ter que elaborar um pouco mais sobre o problema de "barra extra" e talvez forneça alguns exemplos. Eu não entendo muito bem a questão.

Com os comentários, agora entendo que o problema da barra está aqui:

RewriteCond %{THE_REQUEST} /index\.(php|html)
RewriteRule (.*)index\.(php|html)(.*)$ /$1$3 [r=301,L]

Para se livrar da barra extra, basta incluí-la na outra parte que você está tirando: ( index.php ):

RewriteCond %{THE_REQUEST} /index\.(php|html)
RewriteRule (.*)index\.(php|html)/(.*)$ /$1$3 [r=301,L]
    
por 05.06.2012 / 02:58