#regex #.htaccess #redirect
#регулярное выражение #.htaccess #перенаправление
Вопрос:
По какой-то причине, которую я не могу понять, следующее правило перезаписи не работает. Символ ‘ в порядке, если я установлю его beween () в соответствии сhttps://www.regextester.com /
Если я проверю правило с помощью https://htaccess.madewithlove.be / URL, который я использую для тестирования (www.google.com/Articles/Rob ‘sRecommendations.html ) не запускает правило.
RewriteRule ^/Articles/Rob(')sRecommendations.html /looking-for-something/ [L,NC,R=301]
Есть идеи?
Комментарии:
1. Мне слишком поздно публиковать ответ, извините, но; попробуйте протестировать без апострофа как в URL, так и в
.htaccess
правиле, и вы получите тот же результат — «Это правило не было выполнено».; проблема не так просто в апострофе. Также; убедитесь, что при тестированииRewriteEngine
естьon
, если madewithlove.be заботится об этом.
Ответ №1:
Косая черта в вашем правиле перезаписи — это то, что, по-видимому, вызывает проблему. Использование https://htaccess.madewithlove.be / для проверки https://www.google.com/Articles/Rob ‘sRecommendations.html со следующим правилом .htaccess работает.
RewriteRule ^/?Articles/Rob(')sRecommendations.html looking-for-something/ [L,NC,R=301]
В приведенном выше правиле .htaccess исходное «/» заменено на «/?»
Тестирование с полностью удаленной косой чертой также , похоже, работает, но следующий источник объясняет, почему использование «/?» предпочтительнее и более универсально.
Подробная информация:
Строка {REQUEST_URI} начинается с символа /. Apache изменил движки регулярных выражений при смене версий, поэтому для Apache версии 1 требуется начальная косая черта, в то время как Apache 2 запрещает это! Мы можем удовлетворить обе версии, сделав начальную косую черту необязательной с выражением ^/? (? является метасимволом для нуля или одного из предыдущих символов). Итак, теперь у нас есть:
Комментарии:
1.Спасибо! Однако я пытаюсь перенаправить URL-адреса, содержащие пробел, также следующим образом:
https://www.google.com/Articles/Rob's Recommendations.html
(x20)
Это должно обнаружить пробел, но вместо этого я получаю это:Flags should be surrounded by square brackets.
2.@Fernando Нет проблем! ( ) представляет пробел (он экранируется косой чертой и заключен в круглые скобки), а * означает, что его количество равно 0 . Попробуйте
RewriteRule ^/?Articles/Rob(')s( )*Recommendations.html looking-for-something/ [L,NC,R=301]
эти тесты показывают, что одна строка работает для URL-адресов как с пробелами, так и без них в этой точке: htaccess.madewithlove.be?share=e0fa6df3-dbba-5049-a110-06ce2dfd … htaccess.madewithlove.be?share=e3d5c2dd-75bd-53aa-916b-5e14cb41 …3. Это тоже сработало 🙂 Когда вы говорите, что это 0 случаев .. какие еще есть варианты? Можете ли вы, например, указать, есть ли, например, только 4 пробела для обработки правила? Есть ли какая-либо документация, где я могу узнать больше об этих правилах? Я проверил несколько руководств, но они слишком сложны и их нелегко понять в качестве ваших объяснений.
4. @Fernando Если вы замените * (ноль или более раз) на ? , то пробел будет соответствовать нулю или одному разу. Если вы замените его на , то оно будет соответствовать один или несколько раз. Эти символы здесь являются «Кванторами регулярных выражений». Вы также можете использовать целое число в скобках, чтобы соответствовать точному количеству. {4} будет ровно четырьмя совпадениями с предыдущей последовательностью. Вот источник с дополнительной информацией о кванторах регулярных выражений: javascript.info/regexp-quantifiers