Я пытаюсь перенаправить новостную рассылку URL от моего локального сервера до блока Amazon S3.
Таким образом, я хочу перенаправить от:
https://mysite.com/assets/img/newsletter/Jan12_Newsletter.html
кому:
https://s3.amazonaws.com/mybucket/newsletters/legacy/Jan12_Newsletter.html
Вот первая часть моего правила:
RewriteEngine On
RewriteBase /
# Is it in the newsletters directory
RewriteCond %{REQUEST_URI} ^(/assets/img/newsletter/)(.+) [NC]
# Is not a 2008-2011 newsletter
RewriteCond %{REQUEST_URI} !(.+)(11|10|09|08)_Newsletter.html$ [NC]
## -> RewriteRule to S3 Here <- ##
Если я использую это RewriteRule
для указания на новый подкаталог на S3, это НЕ перенаправит:
RewriteRule ^(/assets/img/newsletter/)(.+) https://s3.amazonaws.com/mybucket/newsletters/legacy/$2 [R=301,L]
Однако, если я буду использовать общее выражение для получения всего пути к файлу, то он перенаправит:
RewriteRule ^(.*)$ https://s3.amazonaws.com/mybucket/newsletters/legacy/$1 [R=301,L]
Почему это только работает с "соответствием все" выражение, но не более определенное выражение?
Так как вы захватываете интересующую вас часть URI уже в первом блоке RewriteCond
, вам не нужно перехватывать его снова, чтобы сделать RewriteRule
, а так как оба ваших RewriteCond
s выполнены, нет необходимости разбирать URI третий раз, так что простая каретка сделает это.
# Is it in the newsletters directory
RewriteCond %{REQUEST_URI} ^/assets/img/newsletter/(.+) [NC]
# Is not a 2008-2011 newsletter
RewriteCond %{REQUEST_URI} !(?:11|10|09|08)_Newsletter.html$ [NC]
RewriteRule ^ https://s3.amazonaws.com/mybucket/newsletters/legacy/%1 [R=301,L]
Таким образом, это должно сделать трюк (совпадения с RewriteCond
s имеют префикс %
вместо $
).
Возможно, это не объясняет, почему Ваш RewriteRule
не совпадает, потому что мне кажется, что это нормально, но при использовании этого метода, это не является обязательным.
В RewriteRule есть некоторые ненужные вещи, которые могут привести к такому поведению.
Попробуйте вместо этого:
RewriteRule ^/assets/img/newsletter/(.+)$ https://s3.amazonaws.com/mybucket/newsletters/legacy/$1 [R=301,L]
Здесь я использую "один или больше" квантификатор для регенерации, так что $1 не может быть пустым в любой момент.