Работы RewriteRule с “соответствием все” шаблон, но не шаблон каталога

Я пытаюсь перенаправить новостную рассылку 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]

Почему это только работает с "соответствием все" выражение, но не более определенное выражение?

0
задан 18 August 2014 в 22:55
2 ответа

Так как вы захватываете интересующую вас часть URI уже в первом блоке RewriteCond, вам не нужно перехватывать его снова, чтобы сделать RewriteRule, а так как оба ваших RewriteConds выполнены, нет необходимости разбирать 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]

Таким образом, это должно сделать трюк (совпадения с RewriteConds имеют префикс % вместо $).

Возможно, это не объясняет, почему Ваш RewriteRule не совпадает, потому что мне кажется, что это нормально, но при использовании этого метода, это не является обязательным.

.
1
ответ дан 4 December 2019 в 13:58

В RewriteRule есть некоторые ненужные вещи, которые могут привести к такому поведению.

Попробуйте вместо этого:

RewriteRule ^/assets/img/newsletter/(.+)$ https://s3.amazonaws.com/mybucket/newsletters/legacy/$1 [R=301,L]

Здесь я использую "один или больше" квантификатор для регенерации, так что $1 не может быть пустым в любой момент.

1
ответ дан 4 December 2019 в 13:58

Теги

Похожие вопросы