子文件夹中的重写 .htaccess

Posted

技术标签:

【中文标题】子文件夹中的重写 .htaccess【英文标题】:Rewriterule .htaccess in subfolder 【发布时间】: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 然后发布相关的日志条目吗? 【参考方案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 文件中一定有错误。

以上是关于子文件夹中的重写 .htaccess的主要内容,如果未能解决你的问题,请参考以下文章

简单的htaccess base重写为子文件夹中的站点,链接与相对路径

子文件夹中的重写规则

根域和子文件夹中的两个 htaccess 中的 404 问题

htaccess 用最终的子文件夹重写 url

在子文件夹中维护单独的.htaccess文件

.htaccess - 将所有内容静默重写/重定向到内部子文件夹