У меня есть такой URL:
http://www.sample.com/do/example/v1/abcd
Я хочу перенаправить его на:
http://sub.sample.com/some/test/do/example/v1/abcd
Итак, я создаю .htaccess файл и использую RewriteRule , чтобы сделать это:
.htaccess
RewriteCond %{HTTP_HOST} ^(www\.)?sample\.com$ RewriteCond %{REQUEST_URI} ^/do/(.*)$ RewriteRule ^(.*) http://sub.sample.com/some/test/do/%1
Все работает нормально, пока "abcd" не изменится на "PjX7% 2Bj69", у которого есть экранированный символ% 2B. Так и с этим URL:
http://www.sample.com/do/example/v1/PjX7%2Bj69
Я получаю:
404 Not Found | The requested URL do/example/v1/PjX7+j69 was not found on this server.
Как мы заметили, Apache изменяет параметр " PjX7% 2Bj69 " на " PjX7 + j69 ". Поэтому я использую NE Flag, чтобы отключить декодирование:
NE Flag
RewriteRule ^(.*) http://sub.sample.com/some/test/do/%1 [NE]
Но это не работает.
Как я могу предотвратить декодирование Apache URL?
Это не то, для чего установлен флаг NE .
NE
Эти пути в любом случае должны быть эквивалентны, потому что вы должны декодировать эти последовательности в поддомене. Если вы действительно не можете это исправить, что, как мне кажется, является реальной проблемой, вместо этого вы можете работать с исходным, не закодированным URL:
RewriteCond %{HTTP_HOST} ^(?:www\.)?sample\.com$ RewriteCond %{THE_REQUEST} ^\S+\s+/do/(.*)\s RewriteRule ^ http://sub.sample.com/some/test/do/%1 [R,END]