子文件夹中的重写 .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_rewrite
的Apache'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];
spinach
和1
都不存在于数组中,导致触发。
解决方案是在访问该索引之前确保索引或偏移量存在。这可能意味着您需要修复程序中的错误,以确保这些索引在您期望的时候确实存在。或者这可能意味着您需要使用array_key_exists
或isset
来测试索引是否存在:
$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重写为子文件夹中的站点,链接与相对路径