2016-08-15 88 views
14

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

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启用,但由于某种原因,当我去的网址

domain.com/subfolder/chapter/name 

它返回以下错误:

Notice: Undefined index: urlkey 
+0

你有一个父文件夹中包含/子文件夹/ htaccess文件吗? – olegsv

+0

我在父文件夹中没有htaccess文件。 – Nijn

+0

您能否发布完整通知错误?它应该有一个文件和行号。如果是这样,请发布该文件:) – JayIsTooCommon

回答

7

有这样的代码在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)所使用的Apache's content negotiation modulemod_rewrite之前运行,使文件的Apache服务器匹配扩展。所以如果/file是URL,那么Apache将服务于/file.html

也没有必要重写chapter?...可以改写为chapter.php?...

+0

添加-MultiViews给我一个404错误。 – Nijn

+0

这不仅仅是'-MultiViews'的增加我还改写了重写规则的目标为'chapter.php?...'而不是'章节?...' – anubhava

+0

我改变了章节?到chapter.php?但我得到一个404错误:在这台服务器上找不到请求的URL /子文件夹/章节/名称。 – Nijn

1

你的错误是不相关的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()开始,并且索引也存在。

+0

章节的名称对于所有章节都是不同的。这不应该是不同的?使用你的代码,我收到了同样的错误:注意:未定义的索引:位于/sites/domain.com/www/subfolder/chapter.php的第4行的urlkey。 – Nijn

+0

@Nijn检查我编辑的答案。 – error2007s

+1

嗯,我明白你在说什么,并且urlkey没有找到肯定是错误。但是,它可以在url完全写入时起作用,但不会在使用htaccess重写时起作用。因此,htaccess文件中必须有错误。 – Nijn

1

拆卸时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?

+0

删除RewriteBase不会为我改变任何东西。它给了我'未定义的索引:urlkey'错误 – Nijn

+0

在这个实例中存在'RewriteBase'指令是完全可选的。 – MrWhite