【问题标题】:Rewriterule .htaccess in subfolder子文件夹中的重写 .htaccess
【发布时间】:2016-12-21 12:27:29
【问题描述】:

我需要使用 .htaccess 文件在子文件夹中执行重写。当前 url 的格式如下:

domain.com/subfolder/chapter.php?urlkey=name

需要改写为:

domain.com/subfolder/chapter/name

在子文件夹中,我有一个带有以下代码的 .htaccess 文件:

<IfModule mod_rewrite.c>
    Options -Indexes
    RewriteEngine On
    RewriteBase /subfolder/

    RewriteCond %{REQUEST_FILENAME} !-d 
    RewriteCond %{REQUEST_FILENAME}\.php -f 
    RewriteRule ^chapter/([a-z0-9]+)/?$ chapter.php?urlkey=$1 [L,NC,QSA]
</IfModule>

Modrewrite 已启用,但由于某种原因,当我转到 url 时

domain.com/subfolder/chapter/name

它返回以下错误:

Notice: Undefined index: urlkey

【问题讨论】:

  • 父文件夹中是否有包含 /subfolder/ 的 htaccess 文件?
  • 我的父文件夹中没有 htaccess 文件。
  • 您能发布完整的通知错误吗?它应该有一个文件和行号。如果是这样,请发布该文件:)
  • 完整错误是通知:未定义索引:第 4 行 /sites/domain.com/www/subfolder/chapter.php 中的 urlkey,这是 php 尝试使用 urlkey 接收章节对象的地方.
  • 你能把 LogLevel debug rewrite:trace3 放到你的 apache 配置文件中(不是 .htaccess ),重启 Apache 然后发布相关的日志条目吗?

标签: regex apache .htaccess redirect mod-rewrite


【解决方案1】:

subfolder/.htaccess中有此代码:

Options -MultiViews
RewriteEngine On
RewriteBase /subfolder/

RewriteRule ^chapter/([\w-]+)/?$ chapter.php?urlkey=$1 [L,NC,QSA]

选项MultiViews(参见http://httpd.apache.org/docs/2.4/content-negotiation.html)由运行之前 mod_rewriteApache's content negotiation module 使用,并使Apache 服务器匹配文件的扩展名。因此,如果 /file 是 URL,那么 Apache 将提供 /file.html

也无需重写为chapter?...,您可以重写为chapter.php?...

【讨论】:

    【解决方案2】:

    删除 RewriteBase 时,它确实对我有用

    把它放在子文件夹中请检查

    Options -Indexes
    RewriteEngine On
    
    RewriteCond %{REQUEST_FILENAME} !-d 
    RewriteCond %{REQUEST_FILENAME}\.php -f 
    RewriteRule ^chapter/([a-z0-9]+)/?$ chapter.php?url=$1 [L,NC,QSA]
    

    您必须添加chapter.php? 而不是chapter?

    【讨论】:

    • 删除 RewriteBase 对我来说没有任何改变。它给了我Undefined index: urlkey 错误
    • 在这种情况下,RewriteBase 指令的存在是完全可选的。
    【解决方案3】:

    您的错误与 htaccess 规则无关。

    注意:未定义索引

    当您尝试通过数组中不存在的键访问数组时发生。

    Undefined Index 通知的典型示例是检查下面的示例代码。

    $data = array('foo' => '42', 'bar');
    echo $data['spinach'];
    echo $data[1];
    

    spinach1都不存在于数组中,导致触发。

    解决方案是在访问该索引之前确保索引或偏移量存在。这可能意味着您需要修复程序中的错误,以确保这些索引在您期望的时候确实存在。或者这可能意味着您需要使用array_key_existsisset 来测试索引是否存在:

    $data = array('foo' => '42', 'bar');
    if (array_key_exists('spinach', $data)) {
        echo $data['spinach'];
    }
    else {
        echo 'No key spinach in array';
    }
    

    如果你有这样的代码:

    <?php echo $_POST['message']; ?>
    <form method="post" action="">
        <input type="text" name="message">
        ...
    

    那么$_POST['message']在这个页面第一次加载时不会被设置,你会得到上面的错误。只有当表单提交并且此代码第二次运行时,数组索引才会存在。您通常通过以下方式检查:

    if ($_POST)  ..  // if the $_POST array is not empty
    // or
    if ($_SERVER['REQUEST_METHOD'] == 'POST') ..  // page was requested with POST
    

    上述注意事项在使用 $_POST、$_GET 或 $_SESSION 时经常出现。对于 $_POST 和 $_GET 您只需要在使用它们之前检查索引是否存在。对于 $_SESSION,您必须确保会话以 session_start() 开始,并且索引也存在。

    【讨论】:

    • 所有章节的章节名称不同。这不应该有所不同吗?使用您的代码我收到相同的错误:注意:未定义索引:第 4 行 /sites/domain.com/www/subfolder/chapter.php 中的 urlkey。
    • 嗯,我明白你在说什么,找不到 urlkey 肯定是错误。但是,它在完整写入 url 时有效,但在使用 htaccess 重写时无效。因此,htaccess 文件中一定有错误。
    猜你喜欢
    • 2015-09-27
    • 2012-12-12
    • 1970-01-01
    • 2012-11-22
    • 1970-01-01
    • 2012-02-24
    • 2021-11-20
    • 2014-01-13
    • 2019-12-21
    相关资源
    最近更新 更多