这是我的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]
我的想法基本上是,
RewriteCond %{REQUEST_URI} !^/games/.
我想简单地做这样的事情
类似于逻辑AND REQUEST_URI和-f标志我想
答案 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。