在 - 的里面虚拟主机我得到了这个重定向:
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?
答案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
指令是必需的 - 除非在配置中已启用该指令。