【问题标题】:Why my rewrite rule in htaccess is working in some case only?为什么我在 htaccess 中的重写规则仅在某些情况下有效?
【发布时间】:2020-09-16 22:43:25
【问题描述】:

我尝试使用 .htaccess 文件重写我的一些 URL,但它没有按预期工作。

这是我的.htaccess 文件中的重写规则:

RewriteRule ^(index|administration)/([A-Za-z0-9-]+)(\.php)?$ index.php?c=$1&t=$2 [QSA]

当我继续 www.example.com/index/main 时,我收到 404 错误代码。 所以我尝试将我的重写规则更改为

RewriteRule ^index.php$ index.php?c=index&t=main [QSA]

然后我转到www.example.com/index.php,网页完美显示$_GET中的所有数据(c = index and t = main)。

所以我不知道为什么我的第一条规则不起作用。让我看看你有没有什么想法。 我的服务器是否有可能想要进入 index 文件夹,然后是我的第一条规则的主文件夹,而不考虑我的 .htaccess (www.example.com/index/main)?

【问题讨论】:

  • 什么会产生 404? Apache 还是你的脚本? “我的服务器是否可能要进入索引文件夹” - index 是物理目录吗?您的.htaccess 文件中还有其他指令吗?确保您已禁用 MultiViews。 IE。 Options -MultiViews
  • 您好,非常感谢您的回答,通过在我的 .htaccess 文件中禁用 MultiViews 选项可以完美地工作。您能否发表评论,以便我验证您的答案?
  • 我已将其添加为答案,并包含有关 MultiViews 的更多说明。

标签: .htaccess mod-rewrite


【解决方案1】:

您需要确保禁用 MultiViews(mod_negotiation 的一部分)才能正常工作。因此,在您的 .htaccess 文件顶部添加以下内容:

Options -MultiViews

如果 MultiViews 已启用(默认情况下已禁用,但某些主机有时会在服务器配置中启用此功能),那么当您请求 /index/main 其中 /index.php 已作为物理文件存在时,mod_negotiation 将发出内部请求index.php 之前 mod_rewrite 能够处理请求。 (如果index.html也存在,那么可能会先找到它。)

(MultiViews 本质上通过模拟类型映射并在目录中搜索文件(具有相同的基本名称)来启用无扩展 URL,这将返回具有适当 mime 类型的响应。)

如果发生这种情况,那么您的 mod-rewrite 指令基本上会被忽略(模式不匹配,因为它需要检查index.php)并且index.php 被称为没有 URL 参数否则您的 mod_rewrite 指令将附加。

通过禁用我的 .htaccess 中的 MultiViews 选项可以完美运行

这通常意味着它的 your 脚本(即index.php)触发了 404(可能是由于缺少 URL 参数?),而不是 Apache 本身?

但是,如果您看到 Apache 生成 404,那么它会建议:

  • 您还有一个index.html 文件,在index.php 之前找到.html 文件通常不接受路径信息(即/main),因此会触发 404。
  • 或者,AcceptPathInfo Off 在配置中的其他位置显式设置,当请求在内部重写为 /index.php/main(通过 mod_negotiation)时会触发 404。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-10-31
    • 1970-01-01
    • 2014-01-17
    • 2019-12-27
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多