Apache2 mod_rewrite falha para sub-diretórios inexistentes [duplicados]

1

Uma versão ainda mais curta do meu arquivo .htaccess (o último RewriteCond não estava lá) costumava funcionar perfeitamente na minha hospedagem compartilhada, mas eu mudei para um VPS com Ubuntu 12 com o Apache2, mas ele simplesmente não trabalho (mesmo com as minhas alterações) e não consigo descobrir o porquê. Eu posso acessar example.com ou example.com/news, mas não example.com/article/4

Eu coloquei o bloco mod_rewrite de .htaccess para a configuração vhost vice-versa, mas isso não parece funcionar. Eu estou supondo que realmente tenta ir para o subdiretório do artigo ou algo assim (que não existe assim 404), mas não posso descobrir como impedi-lo de fazer isso.

Estou usando o Apache versão 2.2.22

Meu arquivo host virtual

<VirtualHost 127.0.0.1:80>
DocumentRoot /home/example/www/example.com
RewriteLogLevel 3
RewriteLog /home/example/www/example.rewrite.log
<Directory "/home/example/www/example.com">
AllowOverride All
Options -ExecCGI +FollowSymLinks -Indexes -MultiViews
Order deny,allow
allow from all
<IfModule mod_rewrite.c>
    RewriteEngine On
    RewriteOptions inherit
</IfModule>
</Directory>
AccessFileName .htaccess
ServerSignature Off
ServerName example.com
ErrorLog /home/example/www/example.log
LogLevel warn
</VirtualHost>

Meu arquivo .htaccess

ErrorDocument 404 /index.php?404
ErrorDocument 403 /index.php?403
ErrorDocument 500 /index.php?500

Options -ExecCGI +FollowSymLinks -Indexes -MultiViews

<IfModule mod_rewrite.c>
    RewriteEngine On
    RewriteOptions inherit

    RewriteBase /
    RewriteCond %{REQUEST_FILENAME} !-s
    RewriteCond %{REQUEST_FILENAME} !-l
    RewriteCond %{REQUEST_FILENAME} !-d
    RewriteCond %{REQUEST_FILENAME} !-f
    RewriteCond %{REQUEST_URI} !^/index\.php
    RewriteRule ^(.*)$ /index.php?$1 [L]
</IfModule>

Regravar o log de loop de redirecionamento ao acessar example.com/article/4

[example.com/sid#8475130][rid#867d470/initial] (3) [perdir /home/example/www/example.com/] add path info postfix: /home/example/www/example.com/article -> /home/example/www/example.com/article/4
[example.com/sid#8475130][rid#867d470/initial] (3) [perdir /home/example/www/example.com/] strip per-dir prefix: /home/example/www/example.com/article/4 -> article/4
[example.com/sid#8475130][rid#867d470/initial] (3) [perdir /home/example/www/example.com/] applying pattern '^(.*)$' to uri 'article/4'
[example.com/sid#8475130][rid#867d470/initial] (2) [perdir /home/example/www/example.com/] rewrite 'article/4' -> '/index.php?article/4'
[example.com/sid#8475130][rid#867d470/initial] (3) split uri=/index.php?article/4 -> uri=/index.php, args=article/4
[example.com/sid#8475130][rid#867d470/initial] (2) [perdir /home/example/www/example.com/] trying to replace prefix /home/example/www/example.com/ with /
[example.com/sid#8475130][rid#867d470/initial] (1) [perdir /home/example/www/example.com/] internal redirect with /index.php [INTERNAL REDIRECT]
[example.com/sid#8475130][rid#b6ce9950/initial/redir#1] (3) [perdir /home/example/www/example.com/] strip per-dir prefix: /home/example/www/example.com/index.php -> index.php
[example.com/sid#8475130][rid#b6ce9950/initial/redir#1] (3) [perdir /home/example/www/example.com/] applying pattern '^(.*)$' to uri 'index.php'
[example.com/sid#8475130][rid#b6ce9950/initial/redir#1] (1) [perdir /home/example/www/example.com/] pass through /home/example/www/example.com/index.php
[example.com/sid#8475130][rid#b6cd7058/initial] (3) [perdir /home/example/www/example.com/] strip per-dir prefix: /home/example/www/example.com/404 -> 404
[example.com/sid#8475130][rid#b6cd7058/initial] (3) [perdir /home/example/www/example.com/] applying pattern '^(.*)$' to uri '404'
[example.com/sid#8475130][rid#b6cd7058/initial] (2) [perdir /home/example/www/example.com/] rewrite '404' -> '/index.php?404'
[example.com/sid#8475130][rid#b6cd7058/initial] (3) split uri=/index.php?404 -> uri=/index.php, args=404
[example.com/sid#8475130][rid#b6cd7058/initial] (2) [perdir /home/example/www/example.com/] trying to replace prefix /home/example/www/example.com/ with /
[example.com/sid#8475130][rid#b6cd7058/initial] (1) [perdir /home/example/www/example.com/] internal redirect with /index.php [INTERNAL REDIRECT]
[example.com/sid#8475130][rid#b6ce5440/initial/redir#1] (3) [perdir /home/example/www/example.com/] strip per-dir prefix: /home/example/www/example.com/index.php -> index.php
[example.com/sid#8475130][rid#b6ce5440/initial/redir#1] (3) [perdir /home/example/www/example.com/] applying pattern '^(.*)$' to uri 'index.php'
[example.com/sid#8475130][rid#b6ce5440/initial/redir#1] (1) [perdir /home/example/www/example.com/] pass through /home/example/www/example.com/index.php

Log de acesso resumido

"GET /article/4 HTTP/1.1" 302 4095 "-"
"GET /404 HTTP/1.1" 200 2405 "-"
    
por LEmmaJ 23.11.2013 / 03:58

2 respostas

0

Suas regras de reescrita originais parecem bastante simples:

<IfModule mod_rewrite.c>
    RewriteEngine On
    RewriteOptions inherit

    RewriteBase /
    RewriteCond %{REQUEST_FILENAME} !-s
    RewriteCond %{REQUEST_FILENAME} !-l
    RewriteCond %{REQUEST_FILENAME} !-d
    RewriteCond %{REQUEST_FILENAME} !-f
    RewriteCond %{REQUEST_URI} !^/index\.php
    RewriteRule ^(.*)$ /index.php?$1 [L]
</IfModule>

Você já tentou usar o simples SEO / SEF .htaccess como o que vem junto com o WordPress? Aqui está, mas adicionei a regra RewriteOptions inherit da sua configuração original:

<IfModule mod_rewrite.c>
    RewriteEngine On
    RewriteOptions inherit

    RewriteBase /
    RewriteRule ^index\.php$ - [L]
    RewriteCond %{REQUEST_FILENAME} !-f
    RewriteCond %{REQUEST_FILENAME} !-d
    RewriteRule . /index.php [L]
</IfModule>
    
por 23.11.2013 / 04:36
0

Os registros indicam que suas regras estão funcionando perfeitamente.

O script index.php foi executado com os argumentos ?article/4 e o script respondeu com um redirecionamento 302 para /404 . Não há nenhuma opção [R] em nenhuma dessas regras de reescrita, portanto, deve ser o script que emitiu o redirecionamento.

Uma solicitação de acompanhamento foi feita pelo navegador para /404 e isso gerou uma resposta de 200.

Eu suspeito que você tenha três problemas. A primeira é que seu script emite uma resposta 302 para a URL /404 quando não consegue encontrar o conteúdo. deve emitir uma resposta 404.

A segunda é que seu script /404 emite uma resposta de 200. deve emitir uma resposta 404.

O terceiro é que o seu script index.php não sabe como lidar com o argumento ?article/4 . Eu não sei como o seu script funciona, mas eu sugiro que um pouco de depuração no próprio script pode resolver o seu problema. Use echo() em algumas das variáveis em vários estágios através do script ou algo parecido com file_put_contents("/var/log/apache2/example.com.debug.log", time()." ".$variable."\n", FILE_APPEND) .

    
por 24.11.2013 / 23:16