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
指令。
我正在尝试将所有具有 /__/
的网址重定向到 /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
指令。