Como faço para remover barras à direita de uma URL ao usar o arquivo de índice de diretório padrão do Apache?

5

Estou usando o Apache para exibir um blog que consiste em arquivos HTML estáticos. Atualmente, o blog usa uma estrutura de URL bastante padrão, como esta:

/2010/03/21/my-awesome-blog-post/

que mapeia para o arquivo

/2010/03/21/my-awesome-blog-post/index.html

usando o mod_dir do Apache.

Gostaria de remover a barra final para que URLs como

/2010/03/21/my-awesome-blog-post

trabalhe da mesma maneira (e não seja redirecionado). Existe uma maneira de fazer isso com o Apache?

(Note que eu quero URLs com barra final para continuar a trabalhar, também.)

(Nota: vi algo sobre a diretiva DirectorySlash do Apache, mas Eu não acho que faz o que eu quero ... embora eu não tenha certeza disso.)

    
por mipadi 22.03.2011 / 04:38

6 respostas

6

Você sempre pode usar mod_rewrite para redirecionar o nome do diretório sem a barra final para dirname/index.html . Você pode usar o RedirectConds para garantir que o redirecionamento não seja feito se o URL terminar com uma barra final ou com .html, e que isso se aplica apenas aos URLs das postagens do blog.

Deixe-me preparar um exemplo, isso levará um momento.

# Trailing slashes and .html suffix
RewriteCond !/$
RewriteCond !\.html$

# Check if it's actually a dir and if index.html exists
RewriteCond %{REQUEST_URI} -d
RewriteCond %{REQUEST_URI}/index.html -f

# Rewrite anything that gets through (Probably insecure, but you get the idea)
RewriteRule ^(.*)$ $1/index.html

Editar: Também pode ser combinado com a solução de Matt de adicionar o código de erro de redirecionamento ao RewriteRule. Provavelmente também deve ser feito o último RedirectRule. Consulte a documentação do mod_rewrite para saber mais.

    
por 24.03.2011 / 20:59
11

O Apache Rewrite Guide tem um capítulo sobre o "Problema com Slash Trailing" ( desça um pouco) explicando como resolver o problema com as barras finais em geral.

No entanto, eles também afirmam que a barra final é necessária para diretórios quando a página renderizada usa recursos (imagens, folhas de estilo, ..) com links relativos - o que não funcionará sem a barra:

"The solution to this subtle problem is to let the server add the trailing slash automatically. To do this correctly we have to use an external redirect, so the browser correctly requests subsequent images etc. If we only did a internal rewrite, this would only work for the directory page, but would go wrong when any images are included into this page with relative URLs, because the browser would request an in-lined object. For instance, a request for image.gif in /~quux/foo/index.html would become /~quux/image.gif without the external redirect!"

    
por 26.03.2011 / 13:00
2

Remover o index.php da URL pode ser feito escrevendo apenas duas linhas no seu arquivo .htaccess (mod_rewrite no Apache). Antes de escrever as regras no .htaccess, certifique-se de que o mod_rewrite esteja habilitado (RewriteEngine On) no seu servidor Apache. O mais provável é que o mod_rewrite esteja habilitado em um servidor Linux, mas para um servidor windows você pode precisar contatar o pessoal de hospedagem para habilitar o mod_rewrite. Você pode verificar isso procurando em phpinfo ().

Abaixo estão as regras que removerão index.php da URL:

RewriteCond %{THE_REQUEST} ^[A-Z]{3,9} /([^/]+/)*index.php HTTP/ 
RewriteRule ^(([^/]+/)*)index.php$ http://www.%{HTTP_HOST}/ [R=301,NS,L]

Redirecionar 301 significa "Movido permanentemente", portanto, a maioria dos mecanismos de pesquisa removerá index.php da URL.

    
por 24.03.2011 / 21:00
2

Você leu a definição do DirectorySlash ?

The DirectorySlash directive determines, whether mod_dir should fixup URLs pointing to a directory or not.

Typically if a user requests a resource without a trailing slash, which points to a directory, mod_dir redirects him to the same resource, but with trailing slash for some good reasons:

  • The user is finally requesting the canonical URL of the resource
  • mod_autoindex works correctly. Since it doesn't emit the path in the link, it would point to the wrong path.
  • DirectoryIndex will be evaluated only for directories requested with trailing slash.
  • Relative URL references inside html pages will work correctly.

Well, if you don't want this effect and the reasons above don't apply to you, you can turn off the redirect with:

# see security warning below!
<Location /some/path>
DirectorySlash Off
SetHandler some-handler
</Location>
    
por 29.03.2011 / 19:12
1

Eu tive o mesmo problema, mas estava usando o mod_alias para configurar um subsite. Acontece que eu precisava fazer um segundo alias sem a barra final para que funcionasse corretamente. Parecia algo assim:

Alias /forum/ "/var/www/forum"
Alias /forum "/var/www/forum"

<Directory "/var/www/forum">
    Options FollowSymlinks
    AllowOverride None
    Order allow,deny
    Allow from all
</Directory>

No Ubuntu, eu tive que editar o arquivo /etc/apache2/mods-enabled/alias.conf com estas linhas, então reiniciar o apache. Não foi possível encontrar essa resposta em nenhum lugar da Web. Eu apenas tropecei em mim como mod_rewrite não estava funcionando eo comando DirectorySlash não ajudou tanto. Eu estava anexando um programa não-Drupal como um subsite sob uma instalação Drupal, que é o que desencadeou toda essa loucura em primeiro lugar ...

    
por 19.07.2013 / 22:56
0

Você pode tentar um alias: link

    
por 26.03.2011 / 09:06