VirtualHost Redirect 应该与新的 RewriteBase 一起使用

VirtualHost Redirect 应该与新的 RewriteBase 一起使用

在 - 的里面虚拟主机我得到了这个重定向:

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 /thisIsMeURL 中的 丢失了。

我怎样才能获得如上所示的正确 URL?

答案1

RewriteBase用于按目录重写,即使用目录的相对路径进行重写。您的重写包含绝对路径,因为它指向一个完全不同的主机名。(它可能位于同一主机上,但 mod_rewrite 不知道这一点……)。

您不应该使用RewriteBase,而应该添加想要插入的实际路径--例如:

    RewriteRule (.*) http://example.org/ThisIsMe/$1 [R=301,L,NC]

答案2

正如 @JennyD 在她的回答中所述,RewriteBase当使用绝对 URL 时,该指令不适用代换指令中的字符串RewriteRule

但是,发布的指令应该已经按预期工作(RewriteBase不是必需的)。捕获的反向引用($1)应该已经包含完整的 URL 路径。即thisIsMe/wp-content/uploads/someImage.jpg

除非...在您的/thisIsMe/.htaccess文件中,您使用 mod_rewrite 继承来<Directory>.htaccess文件中就地继承 mod_rewrite 指令。考虑到您尝试RewriteBase在此处设置,这似乎很有可能。由于 mod_rewrite 指令实际上是在子目录的文件中就地复制(继承).htaccess,因此您将丢失从捕获的反向引用中获得的子目录。

要解决此问题,您可以:

  • 从文件中完全删除 mod_rewrite 指令/thisIsMe/.htaccess- 如果此处有其他/特定的 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指令是必需的 - 除非在配置中已启用该指令。

相关内容