RewriteRule 适用于 .htaccess 但不适用 httpd.conf

RewriteRule working on .htaccess but not httpd.conf

我正在尝试将所有具有 /__/ 的网址重定向到 /public/assets/ 并使其在 .htaccess 中工作但在 httpd.conf 中无法全局工作 它应该做的是重写:

http://example.com/__/test.css

http://example.com/public/assets/test.css

到目前为止,我已经为 .htaccess 工作了:

RewriteRule ^(.*)/?__/(.*)$ /public/assets/ [L]

(可能写得不正确,但这是我设法让它工作的唯一方法)。但是,如果我把它放在 httpd.conf 中,它根本不起作用。我试着调整它,试着把它放在 <VirtualHost 127.0.0.1><Directory "c:/DEV/wamp/www/"> 里面,但它仍然不起作用。现在已经浪费了 3 个小时的时间,并在 Whosebug/forums 上找到了很多示例,但奇怪的是 none 其中对我有用..

编辑: 这是我尝试过的两个块示例。 [R] 是验证规则是否有效和重定向:

<VirtualHost 127.0.0.1>
    DocumentRoot "c:/DEV/wamp/www/"
    <Directory "c:/DEV/wamp/www/">
        Allow From All
        RewriteEngine On
        RewriteRule ^/(.*)?__/(.*)$ /public/assets/ [R]
    </Directory>
</VirtualHost>

还有这个:

<Directory "c:/DEV/wamp/www/">
    Allow From All
    RewriteEngine On
    RewriteRule ^/(.*)?__/(.*)$ /public/assets/ [R]
</Directory>

编辑2: 尝试从建议的答案中选择编辑,仍然无法在服务器上找到 css 文件。

<Directory "c:/DEV/wamp/www/">
    Allow From All
    RewriteEngine On
    RewriteRule ^__/(.*)$ public/assets/ [L]
</Directory>

RewriteRule ^/(.*)?__/(.*)$

您在 <Directory> 容器中的 RewriteRule 模式中包含了斜杠前缀。这应该与您的 .htaccess 文件中的相同,即。没有 directory-prefix.

.htaccess 文件和 <Directory> 容器在这方面的行为相同。只有当服务器配置/VirtualHost 容器中的指令是 directly 时,才应该包含 directory-prefix(但它匹配 URL-path,而不是文件系统路径,因为它在 .htaccess / 目录上下文中执行。

如果将其放入 <Directory> 容器中,则无需“调整它”。

I'm trying to redirect

严格来说,这是一个内部重写(正如您在 .htaccess 文件中所做的那样),而不是外部重定向


/__/<file> to /public/assets/<file>
RewriteRule ^(.*)/?__/(.*)$ /public/assets/ [L]

可以简化此重写,前提是 /__/ 始终出现在 URL-path 的开头。在 .htaccess 文件或 <Directory> 容器中尝试以下操作:

RewriteRule ^__/(.*)$ public/assets/ [L]

[编辑] 警告:mod_rewrite 继承

如果您在服务器配置中测试 .htaccess 和 <Directory> 容器之间切换,并且想知道为什么 <Directory> 容器中的指令没有执行任何操作,那么可能是 mod_rewrite .htaccess 中的指令完全覆盖了 <Directory> 容器中的指令。这是默认行为。 .htaccess 指令将优先,默认情况下不继承父指令。

一般来说,如果您在服务器配置中使用 <Directory> 容器,那么您不需要 .htaccess,因此最简单的选择是在您的 <Directory> 容器中使用 AllowOverride None。所以,<Directory> 容器看起来像:

<Directory "c:/DEV/wamp/www/">
Allow From All
AllowOverride None
RewriteEngine On
RewriteRule ^__/(.*)$ public/assets/ [L]
</Directory>

如果您需要在 .htaccess 和父 <Directory> 容器中都有 mod_rewrite 指令,那么您需要通过在 .htaccess 中放置以下指令来显式启用 mod_rewrite 继承:

RewriteOptions Inherit

如果您使用的是 Apache 2.4,那么您有更多选择。

您不能简单地禁用 .htaccess 中的重写引擎(即 RewriteEngine Off),因为这也会阻止处理父指令。如果您只是从 .htaccess 中删除 RewriteEngine 指令,那么 <Directory> 容器中的 RewriteEngine On 指令将启用重写引擎,但会导致 .htaccess 指令再次覆盖父级,因此您回到要求 RewriteOptions Inherit 指令。