#regex #apache #.htaccess #mod-rewrite #url-rewriting
#регулярное выражение #apache #.htaccess #мод-перезапись #url-перезапись
Вопрос:
Я хочу изменить URL-адреса на своем веб-сайте с page.php?id=1amp;name=john
на page/1/john
использование htaccess RewriteRule.
Это то, что у меня есть в настоящее время, но оно работает не так, как ожидалось:
RewriteRule ^page/([0-9] )/([a-zA-Zs-] ) page.php?id=$1amp;name=$2
Возможно ли внести это изменение в правила htaccess или я должен изменить каждую ссылку <a href='page.php/1/john'>Page</a>
, которая утомительна, поскольку у меня много ссылок на каждой странице. Помощь приветствуется. Спасибо.
Комментарии:
1. пожалуйста, прикрепите свой htaccess, о котором идет речь
2. Кроме того, помимо того, что сказал анубхава сэр, пожалуйста, четко укажите, с какого URL-адреса на какой URL-адрес вы хотите перенаправить или переписать в своем вопросе, спасибо.
3. Почему бы не изменить href с
/page.php?id=1amp;name=john
на/page/1/john
?4. Если быть точным, когда запрашивается page.php?id=1amp;name=john , я хочу отобразить /page/1/john в адресной строке вместо page.php?id=1amp;name=john .
5. Слишком много ссылок и страниц, и мне потребуется некоторое время, чтобы изменить их все. Это будет намного проще, если для этого есть правило htaccess.
Ответ №1:
Вы можете использовать эти 2 правила в site root .htaccess:
Options -MultiViews
RewriteEngine On
RewriteBase /rootfolder/
# external redirect from actual URL to pretty one
RewriteCond %{THE_REQUEST} /page.php?id=(d )amp;name=([^samp;] )s [NC]
RewriteRule ^ page/%1/%2? [R=302,L,NE]
# internal forward from pretty URL to actual one
RewriteRule ^page/(d )/([^/] )/?$ page.php?id=$1amp;name=$2 [L,QSA,NC]
Комментарии:
1. То, что я хочу, было от фактического к чистому.
2. Это уже есть в этом коде. Проверьте это. Первое правило перенаправления
page.php?id=1amp;name=john
подойдет дляpage/1/john
3. @Ammar, это уже есть в ответе анубхавы сэра
# external redirect from actual URL to pretty one
И в моем 1-м решении. Вы могли бы протестировать его и сообщить нам обоим.
Ответ №2:
1-е решение: чтобы перейти от URL-адреса строки запроса к удобному для пользователя URL-адресу, попробуйте выполнить следующее, согласно запросу OP.
Options -MultiViews
RewriteEngine On
RewriteBase /rootfolder/
RewriteCond %{QUERY_STRING} ^id=(d )amp;name=([w-] )/?$ [NC]
RewriteRule ^([^.]*)..*$ /$1/%1/%2/ [QSD,R=302,NC,L]
2-е решение: насколько я понял из вопроса OP, не могли бы вы попробовать следующее. Учитывая, что в соответствии с правилом thumb пользователям будет предоставлен удобный URL-адрес, например, —> http://localhost:80/page/1/john
, и он будет указывать на указанный http://localhost/page.php?id=1amp;name=john
в бэкэнде.
Options -MultiViews
RewriteEngine On
RewriteBase /rootfolder/
RewriteCond %{QUERY_STRING} ^$
RewriteRule ^([^/]*)/([^/]*)/(.*)/?$ /$1.php?id=$2amp;name=$3 [NC,L]
Комментарии:
1. Это вроде как работает, но это приводит меня к localhost/page/1/john// вместо localhost/rootfolder/page/1/john.
2. @Ammar, для показанных примеров у меня все получилось. Я внес небольшое изменение в регулярное выражение, не могли бы вы проверить сейчас 1-е и сообщить мне об этом?
3. Все то же самое. Когда я набираю localhost/rootfolder/test.php?id=1amp;name=john , он перенаправляет меня на localhost/test/1/john
4. @Ammar, не могли бы вы попробовать отредактированное решение сейчас? Я взял ссылку из ответа анубхавы сэра, поэтому добавил
RewriteBase
функцию из его хорошего решения, дайте мне знать. Вы также можете проверить его ответ, дайте нам знать.5. ДА. Наконец-то это сработало после добавления RewriteBase / rootfolder / в первом решении. Большое вам спасибо. Но что, если количество параметров равно только 1, например, page.php?id=1 или page.php?name=john ?