【问题标题】:RewriteRule working on .htaccess but not httpd.confRewriteRule 适用于 .htaccess 但不适用于 httpd.conf
【发布时间】:2016-04-09 05:38:24
【问题描述】:

我正在尝试将所有具有 /__/ 的 url 重定向到 /public/assets/ 并让它在 .htaccess 中工作,但在 httpd.conf 中不能全局工作 它应该做的是重写:

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

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

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

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

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

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

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

还有这个:

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

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

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

【问题讨论】:

  • 你说“不起作用”——它实际上什么也没做?您的 .htaccess 文件是否位于 c:/DEV/wamp/www/.htaccess?如果是这样,那么相应的&lt;Directory&gt; 部分应该 工作。也许将您的 VirtualHost 块添加到您的问题中。
  • 是的,抱歉.. 不起作用 = 规则被完全忽略。是的,.htaccess 在那里:“c:/DEV/wamp/www/.htaccess”。我会将我尝试过的块添加到我的问题中

标签: apache .htaccess mod-rewrite httpd.conf


【解决方案1】:

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

您已在 RewriteRule 容器中的 RewriteRule 模式上添加了斜杠前缀。这应该与您的 .htaccess 文件中的相同,即。没有目录前缀。

.htaccess 文件和&lt;Directory&gt; 容器在这方面表现相同。仅当指令 directly 在服务器配置/VirtualHost 容器中时,才应包含目录前缀(但它匹配 URL 路径,而不是文件系统路径,就像在 .htaccess /目录上下文)。

如果你把它放在&lt;Directory&gt; 容器中,那么应该没有必要“调整它”。

我正在尝试重定向

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


/__/&lt;file&gt;/public/assets/&lt;file&gt;
RewriteRule ^(.*)/?__/(.*)$ $1/public/assets/$2 [L]

这种重写可以简化,只要/__/ 总是出现在 URL 路径的开头。在 .htaccess 文件或 &lt;Directory&gt; 容器中尝试以下操作:

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

[编辑] 警告:mod_rewrite 继承

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

通常,如果您在服务器配置中使用&lt;Directory&gt; 容器,则不需要.htaccess,因此最简单的选择是在&lt;Directory&gt; 容器中使用AllowOverride None 禁用它们。所以,&lt;Directory&gt; 容器看起来像:

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

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

RewriteOptions Inherit

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

您不能简单地禁用 .htaccess 中的重写引擎(即RewriteEngine Off),因为这也会阻止处理父指令。如果您只是从 .htaccess 中删除 RewriteEngine 指令,那么 &lt;Directory&gt; 容器中的 RewriteEngine On 指令将启用重写引擎,但会导致 .htaccess 指令再次覆盖父项,因此您又需要 @ 987654348@指令。

【讨论】:

  • 谢谢 :) 但我已经尝试不使用斜杠前缀,但它也无法正常工作。我在某个地方读到了 httpd.conf 中的 Rewrites 需要额外的斜杠,所以我尝试了它并最终在此处复制粘贴了该版本的代码。基本上我想要的只是domain.com/__/test.css 成为domain.com/public/assets/test.css 但RewriteRule /__/ /public/assets/ 在.htaccess 中不起作用,RewriteRule (.*)/__/(.*) $1/public/assets/$2 也不起作用.这就是为什么我有一条丑陋的规则,我怀疑这是问题所在。
  • /__/ 是否总是出现在 URL 路径的开头?大概有多个文件,不只是test.css?
  • 是的,它总是出现在url的开头,就在domain之后。。不知道为什么原来的开发者会在url中放“/__/”。是的,该资产文件夹中有几个 css/js 文件:)
  • 在这种情况下可以简化指令。我已经更新了我的答案。
  • 感谢您的帮助。我再次更新了我的问题。您的新指令在 .htaccess 中完美运行,但在 httpd.conf 中却不行。我粘贴了我使用的确切代码。我还尝试将 包装在 中。我开始认为 httpd.conf 没有被读取,但我的其他 指令工作正常。
猜你喜欢
  • 2011-07-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-06-29
  • 2016-09-05
  • 1970-01-01
  • 1970-01-01
  • 2019-03-01
相关资源
最近更新 更多