У меня следующая структура 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'