Это то, что я придумал до сих пор, но единственный результат - 404 (не найдено):
RewriteEngine on
RewriteCond %{QUERY_STRING} ^book=18(.*)$
RewriteRule ^(.*)book=(.*)$ http://www.examplesite.com/books/2018/$1.pdf [R=301,L]
Как уже упоминалось в комментариях, это пытаетсясопоставлять два разных URL-адреса одновременно: один, где информация содержится в строке запроса (после «мнимого» * 1006 *), и другой, где информация содержится в URL-пути.Так что, вероятно, он ничего не делает;следовательно, 404.
Я надеялся, что $1
должен ссылаться на строку после "18", поскольку единственная группа в скобках в условии содержит эту строку
$1
относится к первой группе в скобках в шаблоне RewriteRule
(из которых их две).Если вы хотите сопоставить первый подшаблон в последнем сопоставленном условии , то вам нужно использовать обратную ссылку вида %1
.
Однако в вашем примере не содержится ?
и, следовательно, нет строки запроса.Информация вместо этого содержится в URl-пути.(Если это не опечатка в вашем вопросе ?! Это похоже на опечатку, поскольку =
в противном случае является излишним. Но это также полностью изменит ваш вопрос.)
Для перенаправления URL example.com/book=18ABCDEFG
(т. е. информация в URL-пути), тогда вам может понадобиться что-то вроде следующего в верхней части вашего .htaccess
файла в корне документа:
RewriteEngine on
RewriteRule ^book=18([^/]+)$ /books/2018/$1.pdf [R=302,L]
Если код может содержать только определенные символы, тогдарегулярное выражение должно быть соответственно конкретным.В его нынешнем виде он соответствует практически всем.
Тест с 302 (временными) перенаправлениями и только 301 (постоянный), когда вы уверены, что он работает нормально (если предполагается, что он является постоянным). перенаправляет и кэширует браузер).
Перед тестированием вам необходимо очистить кэш браузера.