逻辑和在htaccess modrewrite?

时间:2010-01-10 07:37:06

标签: .htaccess mod-rewrite redirect

这是我的htaccess文件

RewriteBase /

RewriteCond %{HTTP_HOST} ^example.com [NC] 
RewriteRule ^(.*)$ http://www.example.com/$1 [L,R=301] 

RewriteCond %{REQUEST_URI} !^/chat/
RewriteCond %{REQUEST_URI} !^/m/
RewriteCond %{REQUEST_URI} !^/__admin/
RewriteCond %{REQUEST_URI} !^/gzip_headers.php
RewriteCond %{REQUEST_URI} !^/phpfreechat/
RewriteCond %{REQUEST_URI} !^/_temp/


RewriteRule ^.+\.php$ index.php [L]

RewriteRule ^.*\.css gzip_headers.php [L]
RewriteRule ^.*\.js gzip_headers.php [L]

RewriteRule ^classifieds/ /index.php [L]

RewriteCond %{REQUEST_URI} !^/movies/.
RewriteRule ^movies/ /index.php [L]

RewriteCond %{REQUEST_URI} !^/games/.
RewriteRule ^games/ /index.php [L]

RewriteRule ^jntu/ /index.php [L]
RewriteRule ^news/ /index.php [L]

我的想法基本上是,

  • 将所有内容转发给public_html / index.php(某些目录除外)
  • 将所有js和css转发到gzip文件,(我这样做基本上是因为我不是jsut gzipping gzipping它们而且还压缩在tha php文件中)
  • 问题是当我从子目录加载图像时,它们也被重定向到index.php,因此只需为这些目录创建条件并在其中存储图像,如RewriteCond %{REQUEST_URI} !^/games/.

我想简单地做这样的事情

  • 将所有内容转发给index.php(除了顶部的一些条件)
  • 将css和js转发到gzip文件
  • 仅在存在的情况下立即加载图像和闪光灯以及其他一些mime类型。 (JPG | GIF | PNG |瑞士法郎| FLV | MP4 | 3GP | MP3 |拉链| RAR | exe)的

类似于逻辑AND REQUEST_URI和-f标志我想

2 个答案:

答案 0 :(得分:1)

请尝试以下规则:

RewriteCond %{HTTP_HOST} =example.com [NC]
RewriteRule ^ http://www.example.com%{REQUEST_URI} [L,R=301]

RewriteRule .*\.(js|css)$ gzip_headers.php [L]

RewriteCond %{REQUEST_FILENAME} -f
RewriteRule .+\.(jpg|gif|png|swf|flv|mp4|3gp|mp3|zip|rar|exe)$ - [L]

RewriteCond %{REQUEST_URI} !^/(gzip_headers|index)\.php$
RewriteCond %{REQUEST_URI} !^/(chat|m|__admin|phpfreechat|_temp)/
RewriteRule ^.+\.php$ index.php [L]

答案 1 :(得分:0)

如果您的规则仅重定向以“.php”结尾的URI,我不确定为什么您的图片会被重定向。这应该从规则中排除所有其他文件扩展名。

我也不确定你的意思是需要'逻辑和'。如果您在RewriteCond之前有多个RewriteRule行,则这些条件一起进行AND运算,只有在所有条件都为真的情况下才会应用该规则。

你不能使用modrewrite来检查文件是否存在,并说“如果文件存在,不应用任何规则,只需提供文件”。

我认为最好的解决方案是使用名为“静态”的单个顶级目录或“图像”,放置所有文件并将其从规则中排除,或者使用更宽的匹配规则。

因此,例如,您可以将“静态”或“图像”设为特殊目录名,并从规则中排除包含.*/images/.*的任何网址。然后,/something/images/image.jpg/something/else/images/image.jpg将被排除,文件将被提供。

另一种hacky方式是从PHP提供文件。因此,在PHP中,您可以将$_SERVER['REQUEST_URI']转换为文件名并查看它是否存在。如果是这样,你可以将文件内容写入PHP输出流,虽然这不如将其留给Apache那样高效,实际上我真的不推荐它。

但就像我之前说的那样,如果你的规则只匹配以.php结尾的文件,那么你的图像不应该被重定向。我想弄清楚为什么会发生这种情况。有一种方法可以打开mod_rewrite的调试日志记录,但是您必须使用Google。