Переписчик /[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

ОБНОВЛЕНИЕ

Ответил на мой собственный вопрос.

Author: nemmy, 2014-11-09

2 answers

Возможно, вы сможете решить эту проблему с помощью NE (noescape) флаг в директиве RewriteRule? Однако это, по общему признанию, немного озадачивает, так как даже специальные символы не следует удалять полностью, просто преобразуя их в эквивалент шестнадцатеричного кода. Флаг NE позволяет пропускать специальные символы нетронутыми.

Однако ваши текущие правила могут быть значительно упрощены и улучшены.

В настоящее время каждый отдельный запрос обрабатывается RewriteRule шаблон ^(.*)$, так что это неэффективно. Вам нужно только обработать запросы на /change-email.htm, чтобы это можно было переписать в виде одной строки (директивы RewriteCond не требуются):

RewriteRule ^change-email\.htm$ /change-email/ [R=301,NE,L]

Обратите внимание, что RewriteRule обрабатывается первым . Только когда шаблон RewriteRule совпадает, обрабатываются предшествующие директивы RewriteCond.

Вам не нужно сопоставлять строку запроса, так как вы ничего с ней не делаете, кроме как передаете ее прямо в подстановку, которая используется по умолчанию поведение.

 1
Author: MrWhite, 2014-11-09 23:34:23

Проблема была связана с WordPress. Это было удаление @ при переписывании адреса, отличного от www, на адрес www. Проблема решена путем добавления моего старого кода перенаправления (без которого я думал, что смогу обойтись) в начало файла .htaccess:

RewriteCond %{HTTP_HOST} ^example\.com$
RewriteRule (.*) http://www.example.com/$1 [R=301,L]
 1
Author: nemmy, 2014-11-10 01:11:46