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