problemas de variáveis do htacces 2
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
Você pode usar a seguinte regra para reescrever /products/Hello/Goodbye
a /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
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 .htaccess
arquivo adicional no /products
subdiretório? Será (possivelmente) mais fácil ter um único .htaccess
arquivo 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 .htaccess
arquivo 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.php
script. 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 views
no caminho da URL solicitado antes de tentar regravar views.php
. E se views
nã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 .htaccess
arquivo raiz, tente o seguinte. (E remova o /products/.htaccess
arquivo 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 L
sinalizador 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/Goodbye
parte é totalmente opcional e resultará naturalmente na definição dos parâmetros de URL id
e 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/baz
resultará no cat
parâ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_HOST
variável do servidor não é necessária.