Por que o RewriteBase não está funcionando?

2

Aqui está o que estou tentando fazer:

  • domain is thinkingmonkey.me
  • domain has 127.0.0.1 as IP addr
  • mod_alias is installed.

Eu tenho um arquivo conf chamado directories.conf . Em que tenho toda a configuração referente aos diretórios. directories.conf está incluído em httpd.conf

Meu directories.conf tem

Alias /runs /xhprof/xhprof_html

<Directory /mysite/xhprof/xhprof_html>
    Order allow,deny
    Allow from all
    AllowOverride All
</Directory>

Em /mysite/xhprof/xhprof_html/.htaccess . Eu tenho o seguinte:

RewriteEngine on
RewriteBase /runs
RewriteRule  .*  index.php

Tudo o que estou tentando fazer é direcionar qualquer solicitação em /mysite/xhprof/xhprof_html/ para index.php .

Quando solicito thinkingmonkey.me/runs sem barras à direita recebo 404 not found .

Então, eu deduzo que RewriteBase não está funcionando.
O que estou fazendo errado?

    
por ThinkingMonkey 15.01.2012 / 20:50

1 resposta

3

Há algumas coisas em jogo aqui. Primeiro, a diretiva Alias quer que seu lado direito seja um caminho físico absoluto no servidor: você quer

Alias /runs /mysite/xhprof/xhprof_html

<Directory /mysite/xhprof/xhprof_html>
    Order allow,deny
    Allow from all
    AllowOverride All
</Directory>

Em segundo lugar, o RewriteRule RewriteRule .* index.php corresponde não apenas a http://.../runs , mas também a qualquer URL que começa com http://.../runs/ , mesmo, por exemplo, http://.../runs/css/... . Existem algumas maneiras de contornar isso.

Opção 1: você pode ter um RewriteRule somente redirecionando a raiz das execuções para index.php:

    RewriteRule ^$ index.php
    RewriteRule ^/$ index.php

Opção 2: você pode fazer com que o seu mod_rewrite configure coisas de casos especiais que existem como arquivos e redirecione tudo para index.php

    # Require the path the request translates to is an existing file
    RewriteCond %{REQUEST_FILENAME} -f
    # Don't rewrite it, but do stop mod_rewrite processing
    RewriteRule .* - [L]

    # Now, redirect anything into index.php
    RewriteRule .* index.php

Opção 3: você pode especificar alguns URLs especiais e redirecionar todo o restante para index.php

    RewriteCond $1 !^css/
    RewriteCond $1 !^js/
    RewriteRule .* index.php

Opção 4: se você quiser que qualquer mapeamento de URL para um diretório mostre um arquivo index.php (como index.html ), há uma maneira realmente simples, que é provavelmente o que você deseja. Você pode colocar o seguinte em .htaccess ou dentro do bloco <Directory> em directories.conf :

    DirectoryIndex index.php index.html

Nota de rodapé: o RewriteRules acima basicamente elimina todo o URL de qualquer solicitação que acaba sendo mapeada para index.php . Isso inclui sequências de consulta, portanto /runs/?foo=bar é o mesmo que /runs/ . Se não é isso que você quer, você precisa de uma regra como

    RewriteRule ^(.*)$ index.php/$1 [QSA]

que preserva as informações de caminho (a parte $1 ) e a string de consulta ("QSA"="anexação da string de consulta".)

Já escrevi demais? :)

    
por 15.01.2012 / 23:41