首页 > 解决方案 > mod_rewrite 在 before 语句上不能与 RewriteEngine 一起使用

问题描述

我继承了具有以下 .htaccess RewriteRules 的 Web 应用程序

Options FollowSymLinks
RewriteRule .* - [E=CAMPAIGN_MODE:live]

RewriteEngine on
RewriteCond "%{ENV:CAMPAIGN_MODE}" "^live"
RewriteRule ^r/([A-Za-z]{2})/([A-Za-z0-9_]+)$   ?action=saveReferral&code=$2&lang=$1
RewriteRule ^crossfit(/.*)?$    /?lang=cf [R=301,L,QSA]
RewriteRule ^classic(/.*)?$     /?lang=en [R=301,L,QSA]
RewriteCond "%{ENV:CAMPAIGN_MODE}" "^offline"
RewriteCond %{REQUEST_URI} !^/admin/
RewriteCond %{REQUEST_URI} !^/dashboard/
RewriteCond %{REQUEST_URI} !^/includes/
RewriteCond %{REQUEST_URI} !^/images/
RewriteCond %{REQUEST_URI} !^/styles/
RewriteRule ^(.*)$ https://www.somewebsite.com/en-gb/ [R=301]

第一个 RewriteRule 旨在将所有请求重写为 index.php 文件,但自然不应该将请求重写为磁盘上的文件。

上面的 .htaccess 按预期工作 - 直到我将 RewriteEngine 移到所有语句的前面。然后,每个请求都被重写为 index.php,甚至包括磁盘上的文件。

我的问题是:为什么上面的 .htaccess 完全可以与 RewriteEngine 语句在那个位置工作?

标签: mod-rewriteurl-rewritingapache2

解决方案


推荐阅读