Apache, htaccess, reescrever url

2

Eu tenho o arquivo .htaccess que estou usando para testar , aqui está o meu arquivo:

RewriteEngine On
RewriteCond %{REQUEST_URI} ^/([a-z-]+)/?$ [NC]
RewriteRule ^ %{REQUEST_SCHEME}://%{SERVER_NAME}/?title=%1 [L]

Estou usando Apache / 2.4.10 (Win32) em ApacheLounge

Eu tenho o seguinte domínio e subdomínio:

  • example.com
  • m.example.com

Ambos apontam para o mesmo endereço IP, agora como eu esperava do acima .htaccess :

se eu acessar example.com/Article-Name/ , o redirecionamento para example.com/?title=Article-Name será interno , não será possível ver ?title=Article-Name na minha barra de URL.

Aqui está a exceção:

Se eu acessar m.example.com/Article-Name/ , o redirecionamento para m.example.com/?title=Article-Name será external e agora vejo m.example.com/?title=Article-Name em minha barra de URL.

Então, eu estava esperando o mesmo comportamento, se alguém tiver uma ideia, ficarei muito agradecido.

EDITAR:

Eu encontrei uma solução para o problema, mas ainda interessante sobre o problema acima, sobre a solução é usar:

RewriteRule ^ ?title=%1 [L]

Por favor note: esta solução é necessária apenas para m.example.com , eu realmente não tenho ideia de como esta solução está funcionando, eu postei esta solução porque pode ajudar a encontrar a causa do problema acima e como esta solução está funcionando.

EDIT 2 (o arquivo completo .htaccess):

RewriteEngine On


<If "%{HTTP_HOST} = 'avielfadida.ml'">

# The actual condition is really long one so I replaced it for illustration.
RewriteCond %{HTTP_USER_AGENT} (iPhone|Blackberry|Android) [NC]

RewriteRule ^ http://m.%{HTTP_HOST}%{REQUEST_URI} [R,L]

# I have to duplicate the RewriteCond and RewriteRule both inside the <If> and <Else>
RewriteCond %{REQUEST_URI} ^/([a-z-]+)/?$ [NC]

RewriteRule ^ %{REQUEST_SCHEME}://%{HTTP_HOST}/?title=%1 [L]

# The solution(the solution is not required inside this block):
#RewriteRule ^ /?title=%1 [L]
</If>

<ElseIf "%{HTTP_HOST} = 'm.example.com'">

# I have to duplicate the RewriteCond and RewriteRule both inside the <If> and <Else>
RewriteCond %{REQUEST_URI} ^/([a-z-]+)/?$ [NC]
RewriteRule ^ %{REQUEST_SCHEME}://%{HTTP_HOST}/?title=%1 [L]

# The solution(the solution is required here):
# RewriteRule ^ /?title=%1 [L]

DirectoryIndex /m/index.htm /m/index.php /m/index.html
</ElseIf>

Nota importante: não há relação entre o arquivo .htaccess completo e o problema, a razão para essa atualização é pela pequena chance de ter cometido um erro, de qualquer forma testei o .htaccess arquivo com apenas as 3 linhas da questão.

AQUI ESTÁ O ARQUIVO HTTPD.CONF

Última atualização:

RewriteEngine On    

# The actual condition is really long one so I replaced it for illustration.
RewriteCond %{HTTP_USER_AGENT} (iPhone|Blackberry|Android) [NC]

RewriteCond %{HTTP_HOST} !^m\.example\.com$ [NC]
RewriteRule .* http://m.example.com%{REQUEST_URI} [R,L]

RewriteCond %{REQUEST_URI} ^/([a-z-]+)/?$ [NC]
RewriteRule .* /?title=%1 [L]


<If "%{HTTP_HOST} = 'm.avielfadida.ml'">
    DirectoryIndex /m/index.htm /m/index.php /m/index.html
</If>
    
por Aviel Fedida 13.09.2014 / 08:10

1 resposta

5

A maneira como você fez com o caminho relativo está correta

RewriteRule ^ ?title=%1 [L]

De documentação do Apache

Absolute URL

If an absolute URL is specified, mod_rewrite checks to see whether the hostname matches the current host. If it does, the scheme and hostname are stripped out and the resulting path is treated as a URL-path. Otherwise, an external redirect is performed for the given URL. To force an external redirect back to the current host, see the [R] flag below.

m.example.com seria considerado como um host diferente e, portanto, o Apache executa um redirecionamento externo. Então, para garantir que apenas uma reescrita interna seja executada, você precisa usar o caminho relativo como você fez.

Você também pode extrair muitas coisas do arquivo .htaccess. Acho que isso deve fazer o que você está procurando.

RewriteEngine On

RewriteCond %{HTTP_USER_AGENT} (iPhone|Blackberry|Android) [NC]
RewriteCond %{HTTP_HOST} !^m\.example\.com$ [NC]
RewriteRule .* http://m.exmaple.com%{REQUEST_URI} [R,L]

RewriteCond %{REQUEST_URI} ^/([a-z-]+)/?$ [NC]
RewriteRule .* /?title=%1 [L]
    
por 15.09.2014 / 17:40