RewriteCond %{HTTPS} off
RewriteRule !^/articles/(.*)$ https://%{HTTP_HOST}/index.php?name=$1 [L,R=301]
RewriteRule ^(articles/)(.*)$ https://%{HTTP_HOST}/index.php?name=$2 [L,R=301]
Первое правило соответствует all , поскольку URL-путь, соответствующий шаблону RewriteRule
в контексте .htaccess
никогда не начинается с sla sh (вы, кажется, узнали это во втором правиле). Вы также не можете иметь группы захвата в отрицательных шаблонах - по определению, отрицательный шаблон на самом деле ничего не соответствует.
И второе правило выполняется безоговорочно, как для HTTP, так и для HTTPS, поскольку директивы RewriteCond
применяются только к первому следующему RewriteRule
. (Но эти два правила в любом случае можно объединить в одно.)
Чтобы внешне «перенаправить» (в соответствии с вашим примером) URL-адрес вида http://example.com/this-is-old-url/
(или http://example.com/articles/this-is-old-url/
) на https://example.com/index.php?name=this-is-old-url
, тогда вы в верхней части файла .htaccess
можно выполнить следующие действия:
RewriteCond %{HTTPS} off
RewriteRule ^(?:articles/)?([\w-]+/)$ https://%{HTTP_HOST}/index.php?name=$1 [R=301,L]
ОБНОВЛЕНИЕ: регулярное выражение теперь включает -
(дефисы) и конечный sla sh. Обратите внимание, что конечный sla sh включен как часть группы захвата. Таким образом, он перенаправляет на /index.php?name=this-is-old-url/
(с конечным sla sh).
Подшаблон (?:articles/)?
является необязательным и не захватывается. Итак, это одно правило соответствует URL-адресам вашего примера.
Оболочка <IfModule>
не требуется. И ни одна из них не является директивой RewriteEngine
, поскольку она, вероятно, уже есть в следующем блоке кода WordPress.
Вам необязательно указывать index.php
, вы можете вместо этого перенаправить на /?name=...
при условии, что DirectoryIndex
установлен правильно.
Вам нужно очистить кеш браузера перед тестированием. (Предпочтительно сначала выполнить 302 - временные - перенаправления.)
Я не могу получить доступ к своему домену https://example.com
, который меняется на https://example.com/index.php?name=
.
Это невозможно Это произошло с вашими существующими правилами, только если вы запросили http://example.com
(обратите внимание, HTTP, а не HTTPS).