LINUX.ORG.RU
ФорумAdmin

Подскажите по mod_rewrite

 , ,


0

1

Есть тут спецы по Apache, а именно по директивам mod_rewrite?

В общем есть такой код в .htaccess:

RewriteEngine On

RewriteCond %{HTTPS} off [OR]
RewriteCond %{HTTP_HOST} ^www.domain.ltd$ [NC]
RewriteRule ^(.*)$ https://domain.ltd/$1 [R=301]

RewriteCond %{REQUEST_URI} /videos.php?t=t
RewriteRule ^(.*)$ https://domain.ltd/videos/ [L]

RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule .* loader.php [L,QSA]
Как видите тут 3 конструкции RewriteCond+RewriteRule.

Третья обеспечивает работу красивых ссылок типа /videos/ и /photos/ Она была изначально при установки CMS.

Первая обеспечивает редирект с HTTP на HTTPS и с www на без www, её добавил я, она вроде тоже работает.

Вторая должна должна отключать некоторые ненужные страницы, например /videos.php?t=t при переходе на неё должен происходить редирект на /videos/ Так вот это у меня и не работает, помогите понять где я ошибся.

★★★★★

http://httpd.apache.org/docs/2.4/mod/mod_rewrite.html#rewritecond

RewriteCond TestString CondPattern [flags]
Во-первых, «CondPattern is the condition pattern, a regular expression», следовательно "?" и "." в URI нужно экранировать или использовать прямое соответствие указав спереди «=».
Во-вторых,
REQUEST_URI
The path component of the requested URI, such as "/index.html".
This notably excludes the query string which is available as its own variable named QUERY_STRING.
, т.е. эта переменная не содержит параметров после "?".

Следовательно нужно попробовать так:
RewriteCond %{REQUEST_URI}?%{QUERY_STRING} =/videos.php?t=t
RewriteRule ^ https://domain.ltd/videos/ [L]
либо так
RewriteCond %{THE_REQUEST} ^[^ ]+ +/videos\.php\?(.*&)?t=t(&|$)
RewriteRule ^ https://domain.ltd/videos/ [L]

spirit ★★★★★ ()
Ответ на: комментарий от spirit

Первый вариант не работает, второй приводит к ошибке 500.

Я кстати специальным тестировочным скриптом проверял переменную _SERVER, так вот
[REQUEST_URI] это /videos.php?t=t
а [QUERY_STRING] это t=t
Так что мне кажется конструкция %{REQUEST_URI}?%{QUERY_STRING} не будет иметь смысла.

sunny1983 ★★★★★ ()
Ответ на: комментарий от sunny1983

Да, во втором случае наверное нужно весь regexp в кавычки взять, а то из-за пробела внутри apache его воспринимает не как один параметр, а как два.

специальным тестировочным скриптом проверял переменную _SERVER

Думаю тут лучше задаться вопросом какая взаимосвязь между php-шной переменной $_SERVER и переменными в apache-вских rewrite-директивах.
Думаю правильный ответ - никакой.

По REQUEST_URI я привёл пример из официальной документации: excludes the query string which is available as its own variable named QUERY_STRING

spirit ★★★★★ ()