problemas de variáveis ​​do htacces 2

Nov 26 2020

ANTES de instalar o SSL, as coisas funcionavam perfeitamente !! Aqui está o código que tenho em meu arquivo .htaccess do servidor da web raiz:

Options +MultiViews
RewriteEngine On
RewriteCond %{HTTP_HOST} andrea\.com [NC]
RewriteCond %{SERVER_PORT} 80
RewriteRule ^(.*)$ https://andrea.com/$1 [R,L]

RewriteCond %{DOCUMENT_ROOT}/$1.php -f RewriteRule (.*) $1.php [L]

Funciona e faz exatamente o que eu quero fazer. Então, se eu for, por exemplo:

www.andrea.com/account

acessa "www.andrea.com/account.php". É isso que eu quero. No entanto, tenho uma pasta na raiz chamada "produtos". Há outro arquivo ".htaccess" nessa pasta e não sei qual desses 2 deve ser alterado para fazer o seguinte funcionar.

Quando você acessa este url: http: ____ / products / view / Hello / Goodbye

Eu quero que ele acesse "view.php" na pasta 'produtos' e nesse arquivo php eu poderia fazer isso:

$id = $_GET["id"];    //      This would have "Hello"
$cat = $_GET["cat"];    //   This would have "Goodbye"

E isso funciona bem quando eu uso este htaccess na pasta "produtos":

RewriteEngine on
RewriteCond %{HTTP_HOST} !^$ RewriteCond %{HTTP_HOST} !^www\. [NC] RewriteCond %{HTTPS}s ^on(s)| RewriteRule ^ http%1://www.%{HTTP_HOST}%{REQUEST_URI} [R=301,L] RewriteCond %{REQUEST_FILENAME} !-f RewriteCond %{REQUEST_FILENAME} !-d RewriteRule ^([^/]*)/?(.*)$ /products/view.php?id=$1&cat=$2

O problema com este código acima é, se eu for para: http: ____ / products / Hello / Goodbye

Quero acessar o "index.php" que está na pasta "produtos". Mas em vez disso, ele vai para "view.php" !! É como se o código htaccess acima forçou todos a irem para view.php (o que só deve ser feito se eu tiver "view / ____" no url. Quero que o url acima vá para "index.php" nos "produtos "e nesse arquivo devo ser capaz de acessar as variáveis ​​ID e CAT.

Alguma ideia do que alterar no meu arquivo .htaccess? Lamento ter passado mais de 2 horas, não entendi uma única linha no final do meu código, mas não funciona: /

Respostas

1 AmitVerma Nov 26 2020 at 11:35

Você pode usar a seguinte regra para reescrever /products/Hello/Goodbyea /products/index.php.

RewriteRule ^Hello/GoodBye/?$ /product/index.php?id=hello&cat=Goodbye  [L,NC]

Aqui está o seu completo /product/.htaccess.

RewriteEngine on
RewriteCond %{HTTP_HOST} !^$
RewriteCond %{HTTP_HOST} !^www\. [NC]
RewriteCond %{HTTPS}s ^on(s)|
RewriteRule ^ http%1://www.%{HTTP_HOST}%{REQUEST_URI} [R=301,L]
#rewrite /products/Hello/GoodBye to /products/index.php
RewriteRule ^Hello/GoodBye/?$ /products/index.php?id=Hello&cat=Goodbye [L,NC] ################### RewriteCond %{REQUEST_FILENAME} !-f RewriteCond %{REQUEST_FILENAME} !-d RewriteRule ^([^/]*)/?(.*)$ /products/view.php?id=$1&cat=$2
1 MrWhite Nov 27 2020 at 07:13
 Options +MultiViews

Primeiro, você deve desabilitar MultiViews. Em minha resposta à sua pergunta anterior , minha sugestão de usar MultiViews foi estritamente um método "alternativo" no contexto de sua pergunta. Você não pode usar os dois métodos (mod_rewrite e MultiViews) para trabalhar com URLs sem extensão. E como agora você deseja fazer mais coisas e passar parâmetros, os MultiViews só criarão conflitos. (MultiViews provavelmente "vencerão" e nenhum parâmetro será passado.)

Além disso, você precisa especificamente do .htaccessarquivo adicional no /productssubdiretório? Será (possivelmente) mais fácil ter um único .htaccessarquivo na raiz do documento. Isso evitará a repetição do redirecionamento de HTTP para HTTPS (embora você não tenha realmente incluído um redirecionamento de HTTP para HTTPS no .htaccessarquivo de subdiretório ?).

# /products/.htaccess
RewriteRule ^([^/]*)/?(.*)$ /products/view.php?id=$1&cat=$2

Essa diretiva corresponde a view/Hello/Goodbye e Hello/Goodbye , o que explica por que tudo está sendo escrito em seu view.phpscript. No entanto, não está realmente fazendo o que você diz - o que é intrigante. Se você solicitar /products/view/Hello/Goodbye, ele reescreverá a solicitação para /products/view.php?id=view&cat=Hello/Goodbye- o que não é a intenção (a menos que MutliViews esteja habilitado, caso em que nenhum parâmetro será passado).

Você precisa realmente verificar viewsno caminho da URL solicitado antes de tentar regravar views.php. E se viewsnão estiver presente, reescreva para index.php. Esta "ramificação condicional" pode ser alcançada simplesmente organizando as diretivas na ordem das regras "mais específicas" primeiro.

Por exemplo, em seu .htaccessarquivo raiz, tente o seguinte. (E remova o /products/.htaccessarquivo completamente.)

# Ensure that MultiViews is disabled
Options -MultiViews

RewriteEngine On

# HTTP to HTTPS canonical redirect
RewriteCond %{HTTP_HOST} example\.com [NC]
RewriteCond %{SERVER_PORT} 80
RewriteRule (.*) https://example.com/$1 [R=301,L]

# Abort early if the request already maps to (or looks like) a file or directory
RewriteCond %{REQUEST_URI} \.\w{2,4}$ [OR] RewriteCond %{REQUEST_FILENAME} -f [OR] RewriteCond %{REQUEST_FILENAME} -d RewriteRule ^ - [L] # 1. Rewrite "/products/view/<id>/<cat>" to "/products/view.php?id=<id>&cat=<cat> RewriteRule ^(products/view)/([^/]*)/?(.*) $1.php?id=$2&cat=$3 [L]

# 2. Rewrite "/products/<id>/<cat>" to "/products/index.php?id=<id>&cat=<cat>
RewriteRule ^(products)/([^/]*)/?(.*) $1/index.php?id=$2&cat=$3 [L] # 3. Extensionless URLs for other requests RewriteCond %{DOCUMENT_ROOT}/$1.php -f
RewriteRule (.*) $1.php [L]

A ordem das 3 regras acima é importante. A regra mais específica é a primeira. Incluindo o Lsinalizador para evitar processamento adicional (desnecessário).

Observe que, de acordo com suas diretivas originais, para uma solicitação do formulário /products/view/Hello/Goodbye(ou /products/Hello/Goodbye), a Hello/Goodbyeparte é totalmente opcional e resultará naturalmente na definição dos parâmetros de URL ide cat, mas em branco.

Além disso, de acordo com suas diretivas originais, uma solicitação do formulário /products/view/Hello/Goodbye/foo/bar/bazresultará no catparâmetro de URL sendo definido como Goodbye/foo/bar/baz(qualquer coisa que siga o segmento de caminho inicial).

Você não precisa necessariamente verificar se uma solicitação é mapeada para um arquivo ou diretório (o que é relativamente caro ) se você tornar sua regex mais específica e corresponder apenas ao que você precisa. Por exemplo, sua regex /([^/]*)/?(.*)atualmente corresponde a praticamente qualquer coisa . Mas se suas variáveis <id>e <cat>puderem consistir apenas em letras minúsculas (por exemplo), isso pode evitar a necessidade de verificações do sistema de arquivos.

Outras notas:

  • Você precisa verificar o nome do host no redirecionamento de HTTP para HTTPS? Você hospeda vários domínios? Caso contrário, a condição que verifica a HTTP_HOSTvariável do servidor não é necessária.