Apache mod_rewrite: как обрабатывать слеш в URL?

Apache mod_rewrite: как обрабатывать слеш в URL?

У меня следующая структура URL:

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

Я хочу избавиться от index.php?id=123 и вместо этого использовать следующий URL:

http://mysite.com/movies/123

Я создал следующий .htaccess в каталоге /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]

И это работает. Например, когда я указываю ...

http://mysite.com/movies/123

... Я получил ...

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

Проблемы начинаются, когда я указываю...

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

С этим слешем у меня не обрабатывается URL должным образом. Похоже, я вообще не указал id, и все мои стили css не применяются.

Я пробовал играть с регулярными выражениями в правиле, например...

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

... но это не помогло.

Итак, мой вопрос: как обращаться со слешем в моем случае? Мне следует выбрать свое правило перезаписи или нужно сделать что-то еще? Мне нужно убедиться, чтоhttp://mysite.com/movies/123/обрабатывается точно так же, какhttp://mysite.com/movies/123. Есть идеи?

Спасибо,

Обновлять:

ПользовательДСумскийМне помогло (ниже).

Дсумский, большое спасибо за ответ. Я решил оставить комментарий в форме ответа, чтобы иметь возможность форматировать текст.

Во-первых, мне не удалось включить ведение журнала. С этими строками в моем .htaccess ...

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

... У меня следующая ошибка:

Rewrite log not allowed here

Ну, я поместил эти строки в /etc/apache2/apache2.conf и перезапустил apache. Rewrite.log был создан, но он становится пустым, даже когда происходит rewrite.

Во-вторых, это вообще не работало без следующих строк:

RewriteBase /
RewriteCond %{REQUEST_FILENAME} !-f

Поэтому я их добавил. Затем что-то пошло не так с %{HTTP_HOST}, поэтому я немного изменил его, указав путь:

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

Дела пошли лучше. С обоимиhttp://mysite.com/movies/123иhttp://mysite.com/movies/123/Я вижу, что id применен. В первом случае все отлично, но во втором случае стили css не применяются, как будто они вообще не указаны. Я не понимаю, почему это происходит. Для меня это выглядит так, как будто стили применяются ДО того, как будет выполнено Rewrite Rule. Я так думаю, потому что я связываю стили следующим образом:

Итак, похоже, что для /123 это работает, я имею в виду, что Apache может найти ../library/main.css, но для /123/ это, похоже, встроенный каталог и ../library/main.css не работает.

Есть идеи?

Обновление2:

Я понял. Окончательный .htaccess:

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

ДСумский, спасибо за помощь! Я отмечаю ваш пост как ответ.

решение1

Я создал тестовый VirtualHost, отвечающий вашим требованиям, и настроил следующее правило перезаписи, которое, похоже, делает то, что вы хотели:

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]

Правило сопоставляет последнюю часть URI, которая является своего рода идентификатором фильма, и удаляет завершающий слеш, если он там есть.

Если вы не уверены, что происходит с движком перезаписи, включите ведение журнала, как я настроил. Вы можете проверить каждый отдельный шаг, который движок выполнил тогда, и правильно протестировать свои правила.

Я протестировал это со следующими URL-адресами:

http://mysite.com/movies/123
http://mysite.com/movies/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'

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'

Связанный контент