Есть ли какой-либо способ перенаправить на чистый URL-адрес при запросе старого URL-адреса?

#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 ?