Внутри VirtualHost У меня такое перенаправление:
RewriteBase /
RewriteCond %{REQUEST_URI} wp-content/uploads/([^.]+\.(jpe?g|gif|bmp|png))$
RewriteRule (.*) http://example.org/$1 [R=301,L,NC]
Итак, полная конфигурация VirtualHost:
<VirtualHost *:80>
ServerName localhost.foo
ServerAdmin webmaster@localhost
DocumentRoot /home/me/public_html/foo
LogLevel info
ErrorLog /home/me/public_html/foo/error.log
CustomLog /home/me/public_html/foo/access.log combined
<Directory "/home/me/public_html/foo">
Options FollowSymLinks Indexes
AllowOverride All
RewriteBase /
RewriteCond %{REQUEST_URI} wp-content/uploads/([^.]+\.(jpe?g|gif|bmp|png))$
RewriteRule (.*) http://example.org/$1 [R=301,L,NC]
</Directory>
</VirtualHost>
Но в подпапке у меня есть .htaccess
изменение RewriteBase:
RewriteBase /thisIsMe
Теперь, когда я получаю доступ к изображению
http://localhost.foo/thisIsMe/wp-content/uploads/someImage.jpg
http://example.org/thisIsMe/wp-content/uploads/someImage.jpg
http://example.org/wp-content/uploads/someImage.jpg
Так что RewriteBase /thisIsMe
в URL потерялся.
Как мне получить правильный URL-адрес, как указано выше?
RewriteBase
используется для перезаписи для каждого каталога, то есть перезаписи с относительным путем к / от каталога. Ваша перезапись содержит абсолютный path, поскольку он указывает на совершенно другое имя хоста. (Он может быть на том же хосте, но mod_rewrite этого не знает ...).
Вместо того, чтобы использовать RewriteBase
, вы должны добавить фактический путь, который вы хотите вставить, например:
RewriteRule (.*) http://example.org/ThisIsMe/$1 [R=301,L,NC]
Как уже сказал @JennyD в своем ответе, RewriteBase
директива не применяется при использовании абсолютного URL замена струны в RewriteRule
директива.
Однако опубликованные директивы уже должны работать должным образом (RewriteBase
не требуется). Захваченная обратная ссылка ($1
) уже должен содержать полный URL-путь. т.е. thisIsMe/wp-content/uploads/someImage.jpg
.
Если ... в вашем /thisIsMe/.htaccess
файл, который вы используете наследование mod_rewrite для наследования <Directory>
директивы mod_rewrite на месте в .htaccess
файл. Это могло бы показаться вполне вероятным, учитывая, что вы пытаетесь установить RewriteBase
Вот. Поскольку директивы mod_rewrite эффективно копируются на место (наследуются) в подкаталоге .htaccess
файл, вы потеряете подкаталог из захваченной обратной ссылки.
Чтобы решить эту проблему, вы можете:
/thisIsMe/.htaccess
file - не обязательно практично, если здесь есть другие / конкретные директивы mod_rewrite (хотя их всегда можно переместить в конфигурацию сервера). Директивы mod_rewrite в <Directory>
контейнеры затем просто обрабатываются как есть, они не «наследуются» в дочернюю конфигурацию.ИЛИ,
Использовать REQUEST_URI
вместо переменной сервера в унаследованных директивах в <Directory>
контейнер. REQUEST_URI
всегда содержит полный URL-путь (начиная с косой черты). Итак, естественно будет содержать /thisIsMe
префикс. Например:
RewriteEngine On
RewriteRule wp-content/uploads/[^.]+\.(jpe?g|gif|bmp|png)$ http://example.org%{REQUEST_URI} [R=301,L]
Предыдущие RewriteCond
(и RewriteBase
) директивы не требуются. В RewriteEngine On
директива обязательна - если она уже не включена ранее в config.