.htaccess аккуратные URL-адреса, если данные $ _GET имеют пространство, которое перенаправляет на страницу 404

77
13

Я использую.htaccess, чтобы повернуть мой URL из

www.mysite.com/profile.php?name=name

в

www.mysite.com/name/name

Но я столкнулся с проблемой, в которой, если имя имеет пробел вместо того, чтобы показывать пользовательские данные, он берет меня на мою страницу 404. Я закодировал имена, так что если это пространство, то оно заменяет его на %20, но его все еще не работает. Имена без пробела просто отлично

Переписать правила:

RewriteEngine On
RewriteRule ^([a-zA-Z0-9_-]+)$ profile.php?name=$1
RewriteRule ^([a-zA-Z0-9_-]+)/$ profile.php?name=$1

спросил(а) 2021-01-28T00:16:09+03:00 3 месяца, 1 неделя назад
1
Решение
62

Ваше регулярное выражение для перезаписи не учитывает пробелы или закодированные символы. Вместо этого это только совпадение букв, цифр, подчеркивания или тире.

Попробуйте это вместо этого:

RewriteRule /(.+) /profile.php?name=$1 [L]

Основываясь на вашем примере, я бы ожидал, что правило будет выглядеть больше:

RewriteRule /name/(.+) /profile.php?name=$1 [L,QSA]

Это будет соответствовать всему пути GET и передать его в качестве $ 1 для перезаписи. Если вам нужно добавить дополнительные аргументы строки запроса, см. Флаг QSA.

ответил(а) 2021-01-28T00:16:09+03:00 3 месяца, 1 неделя назад
62

Взгляните на свои правила перезаписи. У вас есть регулярное выражение, в котором говорится "одна или несколько букв или цифр":

[A-Za-Z0-9 _-] +

Пробел не является одним из них. Вот почему он не подходит. Добавьте \s в регулярное выражение:

[A-Za-Z0-9 _-\с] +

ответил(а) 2021-01-28T00:16:09+03:00 3 месяца, 1 неделя назад
Ваш ответ
Введите минимум 50 символов
Чтобы , пожалуйста,
Выберите тему жалобы:

Другая проблема