如何在HTACCESS的RewriteEngine规则中添加文件夹访问例外
正确.htaccess配置方案
<IfModule mod_headers.c> Header unset ETag FileETag None <FilesMatch "(?i)^.*\.(ico|flv|jpg|jpeg|png|gif|js|css)$"> Header unset Last-Modified Header set Expires "Fri, 21 Dec 2020 00:00:00 GMT" Header set Cache-Control "public, no-transform" </FilesMatch> </IfModule> <IfModule mod_rewrite.c> RewriteEngine On # 裸域名跳转www规则移到最前,避免逻辑冲突 RewriteCond %{HTTP_HOST} ^mywebsite\.com$ [NC] RewriteRule ^(.*)$ http://www.mywebsite.com/$1 [R=301,L] # 新增三个目录例外规则,匹配到对应路径直接终止后续重写,读取实际文件 RewriteRule ^(beta|products|photos)($|/) - [L] # 原有首页默认重写规则 RewriteCond %{QUERY_STRING} ^$ RewriteRule ^((.)?)$ index.php?p=home [L] RewriteCond $1 /var/www/vhosts/mywebsite.com/httpdocs RewriteRule ^(.+)$ / [L] # 原有白名单补充三个目录排除逻辑,双层保险避免规则覆盖 RewriteCond $1 !^(\#(.)*|\?(.)*|index\.php(.)*|content\/(.)*|css\/(.)*|picture_library\/(.)*|img\/(.)*|readme\.txt(.)*|favicon\.ico(.)*|robots\.txt(.)*|download\.php(.)*|admin\.php(.)*|\.htaccess\.back(.)*|\.htaccess(.)*|external\-export\.php(.)*|login\.php(.)*|cgi-bin\/(.)*|ioncube\/(.)*|test\/(.)*|sitemap\.xml(.)*|old\/(.)*|index\.php\?p\=404(.)*|C079CC0215D2E77B89B0F1837C8199B1\.txt(.)*|images\/(.)*|index\.html(.)*|beta\/(.)*|products\/(.)*|photos\/(.)*) RewriteRule ^(.+)$ index.php?url=$1&%{QUERY_STRING} [L] </IfModule> <IfModule mod_deflate.c> <FilesMatch "\.(js|css|ico|flv|jpg|jpeg|png|gif)$"> SetOutputFilter DEFLATE </FilesMatch> </IfModule>
核心修改说明
- 调整规则优先级:将裸域名跳转www的301规则移到所有重写逻辑最前,避免其他规则先执行导致跳转异常
- 新增例外终止规则:匹配到
beta/products/photos三个路径开头的请求时,直接终止后续所有重写逻辑,直接读取目录内的实际文件 - 补充白名单排除:在原有禁止重写到index.php的白名单规则中新增三个目录的匹配逻辑,作为双层保险避免被后续规则覆盖
生效注意事项
- 修改完成后需要清空浏览器缓存,301永久重定向会被浏览器长期缓存,旧规则缓存未清空会导致测试失效
- 确认三个目录的文件权限配置正确,目录内的index.html/index.php等默认索引文件存在且可读
内容的提问来源于stack exchange,提问作者Omar Juvera
相关产品推荐
相关产品推荐

