Назад | Перейти на главную страницу

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, но он становится пустым, даже когда происходит перезапись.

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

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/ Я вижу, что идентификатор применен. В первом случае все полностью хорошо, но в последнем случае стили css не применяются, как будто они вообще не указаны. Не понимаю, почему так происходит. На мой взгляд, стили применяются ДО того, как выполняется правило перезаписи. Я так думаю, потому что я связываю стили следующим образом:

Итак, похоже, что для / 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]

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

Я создал тестовый 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'