![Redirecionar para URL absoluto em .htaccess retorna nome de host errado no OpenShift](https://rvso.com/image/658339/Redirecionar%20para%20URL%20absoluto%20em%20.htaccess%20retorna%20nome%20de%20host%20errado%20no%20OpenShift.png)
Estou montando um site emOpenShift. Ele é executado no Apache 2.2.15, mas não tenho acesso à raiz ou aos logs do Apache, por isso estou tentando emular diretórios virtuais em um arquivo .htaccess na raiz do meu site. A maior parte está funcionando bem, mas há um problema de redirecionamento que não consigo descobrir.
O site está estruturado assim:
raiz do aplicativo/repo- a raiz do site onde o .htaccess está localizado
raiz do aplicativo/repo/domínio_exemplo
app-root/repo/domain_example/main- site principal (WordPress)
No WordPress, meu blog está em www.example.com/blog, mas antes de migrar para o WordPress, eu tinha vários artigos em um subdomínio blogs.example.com. Para manter links, configurei comandos de redirecionamento em .htaccess. Eles funcionaram bem no meu antigo provedor de hospedagem compartilhada. Eles até funcionaram bem no OpenShiftantesAdicionei www.example.com como um alias do OpenShift. No entanto, desde que adicionei o alias, não consigo forçar o .htaccess a retornar www. se o nome do host original começar com blogs.
Do ApacheRedirecionar documentação:
A nova URL deve ser uma URL absoluta começando com um esquema e um nome de host. No Apache HTTP Server 2.2.6 e posterior, um caminho de URL começando com uma barra também pode ser usado, caso em que o esquema e o nome do host do servidor atual serão adicionados. Então, qualquer solicitação que comece com URL-path retornará uma solicitação de redirecionamento ao cliente no local da URL de destino.
O que eu espero:Se eu fornecer um URL absoluto como destino, o redirecionamento deverá retornar esse URL ao cliente. O cliente pode então reemitir sua solicitação usando a URL correta.
O que está acontecendo:O redirecionamento está acontecendo (vejo o 302 no Firebug), mas aponta para o domínio de origem, não para o destino. É como se estivesse executando o segundo bit (usando o "esquema e nome do host do servidor atual"), embora eu tenha fornecido um URL absoluto.
Aqui está um trecho do meu .htaccess:
Options +FollowSymLinks -MultiViews
RewriteEngine On
RewriteBase /
# This section from https://my.bluehost.com/cgi/help/347#redirect
RewriteCond %{HTTP_HOST} ^(www.)?example\.com$
RewriteCond %{REQUEST_URI} !^/domain_example/
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)$ /domain_example/main/$1
RewriteCond %{HTTP_HOST} ^(www.)?example\.com$
RewriteRule ^(/)?$ domain_example/main/index.php [L]
# blogs.example.com redirects
redirect 302 /mark/post/Check-Windows-Time-Settings.aspx http://www.example.com/blog/2010/05/check-windows-time-settings/
Com esse .htaccess, quando navego parahttp://blogs.example.com//mark/post/Check-Windows-Time-Settings.aspxe visualizar a resposta no Firebug, vejo que o redirecionamento 302 iráhttp://blogs.example.com/blog/2010/05/check-windows-time-settings/. Mas isso não existe, então recebo um 404 Not Found.Por que isso está indo para blogs. quando eu digo para ir para www. ?
Eu me perguntei se o alias do OpenShift está de alguma forma substituindo o Redirect, mas de acordo com a documentação do Redirect:
As diretivas de redirecionamento têm precedência sobre as diretivas Alias e ScriptAlias, independentemente de sua ordem no arquivo de configuração.
Também tentei adicionar uma armadilha explícita e reescrever um caminho que começa com blogs.example.com/blog/ (que é o que o redirecionamento aparentemente está retornando):
RewriteCond %{HTTP_HOST} ^blogs\.example\.com/blog/ [NC]
RewriteRule ^(.*)$ http://www.example.com/blog/$1 [L,R=302]
Ainda recebo o 404 Not Found com isso. Na verdade, mesmo o URL mais básico,http://blogs.example.com/blog/, dá um 404.
Como faço para que os redirecionamentos funcionem nesta situação?
Atualização 27 de maio de 2015 #1
Tentei usar a lógica "not" no bloco Rewrite:
RewriteCond %{HTTP_HOST} !^www\.example\.com/blog/ [NC]
RewriteRule ^(.*)$ http://www.example.com/blog/$1 [L,R=302]
Isso leva a um loop de redirecionamento infinito, 20 redirecionamentos antes de desistir. Cada redirecionamento ainda começa comhttp://blogs.example.comentão algo ainda está impedindo o RewriteRule de escrever o "www" no início do URL.
Mesmos resultados se eu encerrar a lógica NOT com a $
:
RewriteCond %{HTTP_HOST} !^www\.example\.com/blog/$ [NC]
RewriteRule ^(.*)$ http://www.example.com/blog/$1 [L,R=302]
Atualização 27 de maio de 2015 #2
@Quasidynamic apontou que %(HTTP_HOST) inclui apenas o nome do host e nada depois. Então, tentei selecionar apenas URLs começando com www.example.com/blog
:
RewriteCond %{HTTP_HOST} ^blogs\.example\.com$ [NC]
RewriteCond %{REQUEST_URI} ^/blog/$ [NC]
RewriteRule ^(.*)$ http://www.example.com/blog/$1 [R=302,L]
Nenhum loop infinito, mas o Redirect ainda vai para blogs.
, então o Rewrite falha ao enviá-lo para www.
.
Atualização 28 de maio de 2015
Por solicitação de @Quasidynamic, tentando este bloco:
RewriteCond %{HTTP_HOST} ^blogs\.example\.com$ [NC]
RewriteRule ^(.*)$ http://www.example.com/blog/$1 [R=302,L]
Como esperado agora, quando navego para blogs.example.com
, ele é redirecionado para blogs.example.com/blog/
. Como isso ainda corresponde ao RewriteCond, ele é redirecionado para blogs.example.com/blog/blog/
. Ao infinito. Ele nunca vai para www.example.com
, que é a raiz do problema que tive desde o início: depois de adicionar blogs.example.com
um subdomínio OpenShift, não posso mais usar .htaccess para redirecionar, www.example.com
não importa o que eu tente.
Responder1
Se o seu [antigo] for blogs.example.com e [alvo] for www.example.com/blog:
RewriteCond %{HTTP_HOST} blogs.example.com$ RewriteRule ^(.*)$ http://www.example.com/blog/$1 [R=301,L]
Você estava perto, mas estava tentando corresponder /blog na solicitação que não estará lá, é apenas no site [alvo], pelo que entendi sua situação.
Use o código 301 - "O status 301 significa que o recurso (página) foi movido permanentemente para um novo local. O cliente/navegador não deve tentar solicitar o local original, mas usar o novo local a partir de agora." de
https://stackoverflow.com/questions/1393280/http-redirect-301-permanent-vs-302-temporary