#regex #apache #.htaccess #mod-rewrite
#регулярное выражение #apache #.htaccess #модификация-перезапись
Вопрос:
Моя CMS генерирует URL-адреса для статей, подобных этому:
/?action=viewArticleNameamp;page_identifier=lessons
Я переписал это с помощью следующего правила:
RewriteRule ^pages/([a-z,A-Z,0-9-] )/?$ ?action=viewArticleNameamp;page_identifier=$1 [L,NC]
Которое выдает /pages/lessons
для URL.
Моя проблема сейчас в том, чтобы создать что-нибудь с помощью ‘amp;’ или амперсанда. Скажем:
/pages/termsamp;conditions
Я полагаю, что мое выражение ([a-z,A-Z,0-9-] )
не включает эти символы?
Не мог бы кто-нибудь, пожалуйста, объяснить, возможно ли это сделать, и может ли быть какая-либо угроза безопасности?
Предположим, безопасность в большей степени зависит от использования preg_replace или других мер безопасности в классе article? Пожалуйста, поправьте меня, если я ошибаюсь, просто пытаюсь создать простую CMS, которая поможет мне разобраться с вещами..
Оно возвращается из базы данных с помощью следующего php:
public static function getBypage_identifier( $page_identifier ) {
$conn = new PDO( DB_DSN, DB_USERNAME, DB_PASSWORD );
$sql = "SELECT *, UNIX_TIMESTAMP(publicationDate) AS publicationDate FROM articles WHERE page_identifier = :page_identifier";
$st = $conn->prepare( $sql );
$st->bindValue( ":page_identifier", $page_identifier, PDO::PARAM_STR );
$st->execute();
$row = $st->fetch();
$conn = null;
if ( $row ) return new Article( $row );
}
Может ли это быть как-то связано с удалением amp;? База данных находится в utf8_general_ci. И находится в идентификаторе page_identifier как ‘terms-amp;-disclaimer’. Просто открываю пустую страницу.
Ответ №1:
Это было бы так:
RewriteEngine On
RewriteRule ^pages/([a-z0-9,amp;-] )/?$ ?action=viewArticleNameamp;page_identifier=$1 [L,NC,QSA,B]
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME}.php -f
RewriteRule ^(.*)$ $1.php [L]
кстати, вам не нужно ставить запятую внутри символьного класса, если вы не хотите также сопоставлять буквальную запятую.
Комментарии:
1. спасибо Anubhava, выглядит намного приятнее без запятой, думал, это требование. Однако, похоже, что оно не возвращает правильную страницу. Не уверен, почему этого не произошло, остальные страницы без ‘amp;’ работают. Как вы думаете, это может быть проблема с набором символов в БД? Я в тупике..
2. Это единственное правило или у вас есть и другие правила?
3. есть несколько других правил: ‘code’ перезаписать во вторую очередь %{REQUEST_FILENAME} ! -d перезаписать во вторую очередь %{REQUEST_FILENAME}.php -f RewriteRule ^(.*)$ $1.php ‘код’
4. Хорошо, тогда убедитесь, что вы поместили предложенное мной правило перед вашим предыдущим правилом.
5. спасибо, анубхава, я попробовал, но это все еще не работает. Может ли быть так, как я извлекаю идентификатор из базы данных? Я обновил свой вопрос с помощью кода. Действительно ценю помощь