Rewriterule.htaccess в подпапке

Мне нужно выполнить переписывание в подпапке, используя файл .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

Ответы

Ответ 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) используется Apache content negotiation module, который работает до mod_rewrite и делает сервер Apache сопоставить расширения файлов. Поэтому, если /file является URL-адресом, Apache будет обслуживать /file.html.

Также нет необходимости переписывать на chapter?..., вы можете переписать на chapter.php?...

Ответ 2

Ваша ошибка не связана с правилами htaccess.

Примечание: Undefined Индекс

Случается, когда вы пытаетесь получить доступ к массиву с помощью ключа, который не существует в массиве.

Типичный пример уведомления 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() и что индекс также существует.

Ответ 3

При удалении 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?.