Назад | Перейти на главную страницу

VirtualHost Redirect должен работать с новой RewriteBase

Внутри 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

Теперь, когда я получаю доступ к изображению

Так что 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 файл, вы потеряете подкаталог из захваченной обратной ссылки.

Чтобы решить эту проблему, вы можете:

  • Полностью удалите директивы mod_rewrite из /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]
    

    Предыдущие RewriteCondRewriteBase) директивы не требуются. В RewriteEngine On директива обязательна - если она уже не включена ранее в config.