【问题标题】:Problem with RewriteRule and exclusion on codeigniter appCodeigniter 应用程序上的 RewriteRule 和排除问题
【发布时间】:2020-11-24 21:00:22
【问题描述】:

我遇到了.htaccess 文件的问题。

我们曾经有一个主域,即:co.example.com,最近我们切换到了www.example.com。所以我们添加了一个重写规则,将co.example.com/*重定向到www.example.com/*

问题是我们在 co.example.com/api/* 上运行的服务需要保持活动状态,因此我在重定向中添加了排除项

  RewriteCond %{REQUEST_URI} !^api/(.*) [NC]

但无论我如何更改它,Apache 总是执行 301 重定向到 www.example.com/index.php/api/*

这变成了一个问题,因为通过 POST 请求调用服务 y 并在 GET 上进行重定向。

这是.htaccess 文件的示例。

  RewriteEngine On
  RewriteBase /

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

  RewriteCond %{REQUEST_FILENAME} !-f
  RewriteCond %{REQUEST_FILENAME} !-d
  RewriteRule ^.*$ index.php [L]

这条规则可能有什么问题? Apache 服务器在 Nginx 代理后面运行,这可能是个问题吗?

短期内我无法将第 3 方代码更改为指向 www.example.com/api/*,因此如果可能,我需要使用 .htaccess 解决此问题。

非常感谢任何帮助。

【问题讨论】:

  • 我已经在我的回答中解决了最可能的原因。但是,您发布的指令本身不会触发重定向到/index.php/api/*

标签: apache .htaccess codeigniter nginx


【解决方案1】:
RewriteCond %{REQUEST_URI} !^api/(.*) [NC]

REQUEST_URI 服务器变量的值是完整的 URL 路径,其中包括斜杠前缀,因此正则表达式应该是 !^/api/(尾部捕获组 (.*) 似乎是多余的)。否则,此条件将始终成功。

您也可以使用RewriteRule pattern 代替,它匹配 URL 路径减去斜杠前缀(实际上,它减去 目录前缀) .这会稍微更有效率,因为这是首先处理并保存一个附加条件:

RewriteCond %{HTTP_HOST} !^www\.example\.com
RewriteRule !^api/ https://www.example.com%{REQUEST_URI} [L,R=301]

由于我们不再从RewriteRule pattern 中捕获 URL 路径,因此我们需要在 substitution 字符串中使用REQUEST_URI 服务器变量。

您需要在测试前清除浏览器缓存。最好先测试 302(临时)重定向以避免缓存问题。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-11-10
    • 2011-12-17
    • 1970-01-01
    • 2019-05-04
    • 1970-01-01
    • 2022-10-01
    相关资源
    最近更新 更多