Apache mod_rewrite: como lidar com barra na URL?

Apache mod_rewrite: como lidar com barra na URL?

Eu tenho a seguinte estrutura de URL:

http://mysite.com/movies/index.php?id=123

Quero me livrar de index.php?id=123 e usar o seguinte URL:

http://mysite.com/movies/123

Eu criei o seguinte .htaccess no diretório /var/www/mysitecom/movies:

RewriteEngine On
RewriteBase /
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_URI} !=/favicon.ico
RewriteRule ^(.*)$ mysitecom/movies/index.php?id=$1 [L,QSA]

E funciona. Por exemplo, quando eu especifico ...

http://mysite.com/movies/123

... Eu recebo ...

http://mysite.com/movies/index.php?id=123

Os problemas começam quando eu especifico ...

http://mysite.com/movies/123/

Com esta barra, não tenho o URL tratado corretamente. Parece que não especifiquei o id e todos os meus estilos CSS não foram aplicados.

Tentei brincar com expressões regulares na regra como...

RewriteRule ^([^/]+)[/]*$ mysitecom/movies/index.php?id=$1 [L,QSA]

... mas não ajudou.

Então, minha pergunta é como lidar com a barra no meu caso? Devo escolher minha regra de reescrita ou preciso fazer outra coisa? Eu preciso garantir quehttp://mysite.com/movies/123/lida exatamente da mesma maneira quehttp://mysite.com/movies/123. Alguma ideia?

Obrigado,

Atualizar:

Do utilizadorDSumskyme ajudou (abaixo).

Dsumsky, Muito obrigado pela sua resposta. Resolvi comentar no formato da resposta para poder formatar o texto.

Primeiro de tudo, não consegui ativar o registro. Com essas strings no meu .htaccess ...

RewriteLog "/var/log/apache2/rewrite.log"
RewriteLogLevel 3

... tenho o seguinte erro:

Rewrite log not allowed here

Bem, coloquei essas strings em /etc/apache2/apache2.conf e reiniciei o apache. O rewrite.log foi criado, mas fica vazio mesmo quando ocorre a reescrita.

Segundo, não funcionou sem as seguintes strings:

RewriteBase /
RewriteCond %{REQUEST_FILENAME} !-f

Então eu os adicionei. Então algo deu errado com %{HTTP_HOST}, então mudei um pouco especificando um caminho:

RewriteRule ^([^/]*)/?$ mysitecom/movies/index.php?id=$1 [L]

As coisas melhoraram. Com amboshttp://mysite.com/movies/123ehttp://mysite.com/movies/123/Vejo o ID aplicado. No primeiro caso, tudo está completamente bem, mas no último caso, os estilos CSS não são aplicados como se não tivessem sido especificados. Eu não entendo por que isso acontece. Para mim, parece que os estilos são aplicados ANTES da execução da regra de reescrita. Acho que sim porque vinculo estilos da seguinte maneira:

Então, parece que para /123 funciona, quero dizer, o Apache é capaz de encontrar ../library/main.css, mas para /123/ parece ser um diretório incorporado e ../library/main.css não ' não funciona.

Alguma ideia?

Atualização2:

Eu entendi. O .htaccess final:

RewriteEngine On
RewriteBase /
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RedirectMatch ^(.+[\d+])/$ $1
RewriteRule ^([^/]*)$ mysitecom/movies/index.php?id=$1 [L]

DSumsky, Obrigado pela ajuda! Eu marco sua postagem como uma resposta.

Responder1

Criei um VirtualHost de teste para atender aos seus requisitos e configurei a seguinte regra de reescrita que parece fazer o que você pretendia:

RewriteEngine On
RewriteLog "/var/log/httpd/rewrite.log"
RewriteLogLevel 3

RewriteCond %{HTTP_HOST} mysite\.com [NC]
RewriteRule ^/movies/([^/]*)/?$ %{HTTP_HOST}/movies/index.php?id=$1 [L]

A regra corresponde à última parte do URI, que é uma espécie de ID do filme e remove a barra final, se estiver lá.

Quando você não tiver certeza do que está acontecendo em relação ao mecanismo de reescrita, habilite o log como eu configurei. Você pode inspecionar cada etapa que o mecanismo executou e testar suas regras corretamente.

Eu testei com os seguintes URLs:

http://mysite.com/movies/123
http://mysite.com/movies/123/

Encontrei as linhas correspondentes no log:

init rewrite engine with requested uri /movies/123
applying pattern '^/movies/([^/]*)/?$' to uri '/movies/123'
rewrite '/movies/123' -> 'mysite.com/movies/index.php?id=123'

init rewrite engine with requested uri /movies/123/
applying pattern '^/movies/([^/]*)/?$' to uri '/movies/123/'
rewrite '/movies/123/' -> 'mysite.com/movies/index.php?id=123'

informação relacionada