htaccess регулярное выражение для включения амперсанда

#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. спасибо, анубхава, я попробовал, но это все еще не работает. Может ли быть так, как я извлекаю идентификатор из базы данных? Я обновил свой вопрос с помощью кода. Действительно ценю помощь