Mod_rewrite重写了明确告诉他们的东西

时间:2009-07-09 03:40:44

标签: regex apache mod-rewrite

我的.htaccess中有以下重写:

Options +FollowSymLinks 
RewriteEngine On
RewriteRule \.(css|jpe?g|gif|png)$ - [L]
RewriteRule ^index/error/([^/\.]+)/?$ index.php?error=$1 [L]

正如您所知,它应该不会重写任何.css / .jpg / .jpeg / .gif / .png文件。尽管如此,它正在这样做。真正奇怪的是,它下面的一行,重定向/索引/错误/无论是index.php?错误= $ 1,正在完美地工作。我的正则表达式有问题吗?有更好的方法吗?

TIA。

以后多次尝试修复问题后编辑:

我实际上发现了一种不同的(在我看来)更优雅,更简单的方法来做到这一点。我的问题是我的文件包含一个指向我的CSS文件的指针,如href =“。/ css / styles.css”。 styles.css文件永远不会移动。所以,我只是将href元素更改为绝对URI(http://www.mysite.com/css/styles.css)而不是相对URI。问题解决了!感谢所有发帖寻求帮助的人。

3 个答案:

答案 0 :(得分:2)

您可以使用RewriteCond来避免将规则应用于该组扩展,例如

Options +FollowSymLinks 
RewriteEngine On
RewriteCond %{REQUEST_URI} !\.(css|jpe?g|gif|png)$
RewriteRule ^index/error/([^/\.]+)/?$ index.php?error=$1 [L]

此外,您没有提及哪些请求失败以及以何种方式,如果这不足以解决您的问题(很可能),那将是很好的。

答案 1 :(得分:1)

修改网址时,“最后”规则在.htaccess中不是很有用 - 请参阅mod_rewrite tech。在那里,你会看到这是因为重写发生在请求处理的后期,因此它知道目录,但是重写u​​rl为时已晚。它通过创建新请求解决了这个问题,并且新请求再次被相同的规则处理,从而有效地否定了“最后”标志。

我无法看到这种情况如何适用于您的情况。 ' - '不应该是一个url重写。从this web site开始,他们建议使用以下命令来调试重写,您应该会看到为什么您的规则会被忽略。

    You can debug mod_rewriting adding those two directives in httpd.conf:
    RewriteLogLevel 9
    RewriteLog "<path-to-log-file"

正则表达式看起来很好,我在a mod_rewrite example中看到的几乎相同。

答案 2 :(得分:0)

我实际上发现了一种不同的(在我看来)更优雅,更简单的方法来做到这一点。我的问题是我的文件包含一个指向我的CSS文件的指针,如href =“。/ css / styles.css”。 styles.css文件永远不会移动。所以,我只是将href元素更改为绝对URI(http://www.mysite.com/css/styles.css)而不是相对URI。问题解决了!感谢所有发帖寻求帮助的人。