【问题标题】:htaccess shows "Not Found" if directory does not exist如果目录不存在,htaccess 显示“未找到”
【发布时间】:2021-08-24 17:31:46
【问题描述】:

我想将所有匹配<domain>/something/mypage.htm 的内容重写为something.php?pid=mypage,所以我写了以下.htaccess 文件:

RewriteEngine On
RewriteRule ^([a-zA-Z0-9_-]+)/([a-zA-Z0-9_-]+).htm$ $1.php?pid=$2
DirectoryIndex home.php

在我的旧虚拟主机提供商上,规则按预期工作,但在新提供商上,当我尝试打开 <domain>/something/index.htm 或类似名称时,它显示“未找到”。但是当我创建一个名为something 的目录时,重写规则按预期工作。

有人知道这里出了什么问题吗?

【问题讨论】:

    标签: apache .htaccess mod-rewrite


    【解决方案1】:

    看起来MultiViews 可能已在新服务器上启用,这将与您的 mod_rewrite 指令冲突。

    启用MultiViews 并且您请求/something/mypage.htm(当/something.php 作为物理文件存在时),mod_negotiation 将在之前发出/something.php/mypage.htm 的子请求(即/something.php,路径信息为/mypage.htm)您的 mod_rewrite 指令能够处理请求,因此不会传递 pid 参数。 (您的指令与第一个路径段中的点不匹配,因此 MultiViews 的子请求不匹配。)

    如果设置了AcceptPathInfo Off(可能在服务器配置中),则 404 将来自 Apache,或者来自您的脚本,因为没有传递 pid 参数。

    当您创建一个名为something 的子目录时,MultiViews 不会重写请求,因为它已经匹配了 something,即。该名称的目录。

    您需要确保 MultiViews 在您的 .htaccess 文件顶部被禁用:

    Options -MultiViews
    

    注意:默认情况下,Apache 上未启用 MultiViews,但某些共享虚拟主机出于某种原因确实启用了它。它使无扩展名 URL “神奇地”开箱即用,但如果您没有预料到,它实际上会导致更多问题。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-12-10
      • 1970-01-01
      • 1970-01-01
      • 2011-02-21
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多