Переписчик /[email protected]&h=xxxxxx
Мне нужно переписать URL-адреса этой формы:
/[email protected]&h=xxxxxx
Кому:
/change-email/[email protected]&h=xxxxx
Я сделал это в своем.htaccess:
RewriteCond %{REQUEST_URI} ^/change-email\.htm$
RewriteCond %{QUERY_STRING} ^e=(.*)&h=(.*)$
RewriteRule ^(.*)$ /change-email/?e=%1&h=%2 [R=301,L]
Но это переписывание:
/[email protected]&h=xxxxxx
Кому:
/change-email/?e=someonesomewhere.com&h=xxxxx
Обратите внимание, что он удаляет символ @
. Есть какие-нибудь предложения о том, как сделать так, чтобы это работало?
ОБНОВЛЕНИЕ
Использование
http://www.example.com/[email protected]
отлично перенаправляет
Однако:
http://example.com/[email protected]
перенаправляет на
http://example.com/change-email/?e=someonesomewhere.com
(@ символ удален)
Вот мой полный.htaccess:
RewriteEngine On
RedirectMatch 301 /images/(.*) /wp-content/uploads/$1
RewriteRule ^gv5.htm(.*) /get-v5-key/$1 [R=301,L]
RewriteRule ^change-email\.htm(.*)$ /change-email/$1 [R=301,NE,L]
RewriteRule ^unsubscribe\.htm(.*)$ /unsubscribe/$1 [R=301,NE,L]
RewriteRule ^renew-support\.htm(.*)$ /renew-support/$1 [R=301,NE,L]
RewriteRule ^retrieve-license-code\.htm(.*)$ /retrieve-registration-key/$1 [R=301,NE,L]
# BEGIN WordPress
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteBase /
RewriteRule ^index\.php$ - [L]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . /index.php [L]
</IfModule>
# END WordPress
ОБНОВЛЕНИЕ
Ответил на мой собственный вопрос.
2 answers
Возможно, вы сможете решить эту проблему с помощью NE
(noescape
) флаг в директиве RewriteRule
? Однако это, по общему признанию, немного озадачивает, так как даже специальные символы не следует удалять полностью, просто преобразуя их в эквивалент шестнадцатеричного кода. Флаг NE
позволяет пропускать специальные символы нетронутыми.
Однако ваши текущие правила могут быть значительно упрощены и улучшены.
В настоящее время каждый отдельный запрос обрабатывается RewriteRule
шаблон ^(.*)$
, так что это неэффективно. Вам нужно только обработать запросы на /change-email.htm
, чтобы это можно было переписать в виде одной строки (директивы RewriteCond
не требуются):
RewriteRule ^change-email\.htm$ /change-email/ [R=301,NE,L]
Обратите внимание, что RewriteRule
обрабатывается первым . Только когда шаблон RewriteRule
совпадает, обрабатываются предшествующие директивы RewriteCond
.
Вам не нужно сопоставлять строку запроса, так как вы ничего с ней не делаете, кроме как передаете ее прямо в подстановку, которая используется по умолчанию поведение.
Проблема была связана с WordPress. Это было удаление @ при переписывании адреса, отличного от www, на адрес www. Проблема решена путем добавления моего старого кода перенаправления (без которого я думал, что смогу обойтись) в начало файла .htaccess:
RewriteCond %{HTTP_HOST} ^example\.com$
RewriteRule (.*) http://www.example.com/$1 [R=301,L]