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?
.