Usando várias regras de reescrita .htaccess

1

Eu tenho um site que é baseado em uma página de pesquisa, que mostra uma lista, e a próxima é uma página de detalhes dos itens.

se os visitantes usarem rootdomain.com/searchterm , devem ser redirecionados para rootdomain.com/index.php?keyword=searchterm .

Eu tinha que trabalhar agora para os detalhes rootdomain.com/detail/productname , deveria ser redirecionado para rootdomain.com/detail.php?name=productname

e aqui eu falho ...

Eu continuo sendo redirecionado para index.php com meus $ 1 como "detail / productname"

este é o meu .htacces até agora:

RewriteEngine on
RewriteCond $1 !^(index\.php|resources|robots\.txt)
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^/detail/(.*)$  detail.php?name=$1 [L,QSA] -> L here doesn't work either. 
RewriteRule ^(.*)$ index.php?keyword=$1 [L,QSA]

Atualizar

Ok, estou muito perto agora

O problema é que a condição de reescrita só é válida para a próxima regra, então eu tenho que repetir isso aparentemente, eu também adicionei ignore.php na primeira condição, porque meu redirecionamento nos detalhes foi redirecionado novamente para o índice. agora, por alguma razão, minha condição para -f não parece funcionar em detalhes / todos os meus css e imagens não estão funcionando. qual é a melhor maneira de excluí-los

RewriteEngine on
RewriteCond $1 !^(index\.php|detail\.php|resources|robots\.txt)
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^detail/(.*)$  detail.php?name=$1 [L,QSA] 

RewriteCond $1 !^(index\.php|detail\.php|resources|robots\.txt)
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)$ index.php?keyword=$1 [L,QSA]

Atualização 2

Então eu tenho que trabalhar .. Mas eu acho que este não é o caminho mais curto para fazê-lo. Então, se alguém estiver interessado, fique à vontade para tornar isso mais curto.

RewriteEngine on
RewriteCond $1 !^(index\.php|detail\.php|resources|robots\.txt)
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^detail/(images|css|js)/(.*)$  $1/$2 [L,QSA] 

RewriteCond $1 !^(index\.php|detail\.php|resources|robots\.txt)
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^detail/(.*)$  detail.php?name=$1 [L,QSA] 

RewriteCond $1 !^(index\.php|detail\.php|resources|robots\.txt|\.png)
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)$ index.php?keyword=$1 [L,QSA]
    
por woony 21.03.2013 / 13:26

2 respostas

0

Você precisa adicionar o sinalizador L ('last') ao primeiro RewriteRule :

RewriteRule ^/detail/(.*)$  detail.php?name=$2 [L,QSA]

De acordo com a documentação , esse sinalizador:

Stop the rewriting process here and don't apply any more rewrite rules. This corresponds to the Perl last command or the break command in C. Use this flag to prevent the currently rewritten URL from being rewritten further by following rules.

Sem isso, o Apache continua a aplicar a segunda regra de reescrita depois de corresponder à primeira. Como a segunda regra afeta tudo, ela substitui a primeira. (Outra solução seria escrever seus padrões para que duas URLs não correspondam ao mesmo padrão, por exemplo, alterando o segundo padrão para ^[^/](.*)$ .)

    
por 21.03.2013 / 13:56
0

então eu consegui que funcionasse .. Mas eu acho que este não é o caminho mais curto para fazê-lo. Então, se alguém estiver interessado, fique à vontade para tornar isso mais curto.

O que aconteceu, primeira versão, o redirecionamento de detalhes / algo funcionou, mas foi redirecionado para index.php? keyword = detail.php? name = something então eu tive que excluir detail.php na primeira linha de condição. Também rewriteCond são válidos para a próxima regra, não para todos. então eu tive que repeti-los.

Por último, para ter minhas imagens e meu trabalho css eu tive que reescrevê-los para o URL base para as 3 pastas que eu tenho imagens / css / js dentro

Se isso puder ser mais curto ou mais suficiente, sinta-se à vontade para fazê-lo

RewriteEngine on
RewriteCond $1 !^(index\.php|detail\.php|resources|robots\.txt)
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^detail/(images|css|js)/(.*)$  $1/$2 [L,QSA] 

RewriteCond $1 !^(index\.php|detail\.php|resources|robots\.txt)
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^detail/(.*)$  detail.php?name=$1 [L,QSA] 

RewriteCond $1 !^(index\.php|detail\.php|resources|robots\.txt|\.png)
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)$ index.php?keyword=$1 [L,QSA]

- editar ainda não parece à prova de erros, ao usar partes codificadas por url atrás de detalhes / ...

    
por 21.03.2013 / 22:45