Назад | Перейти на главную страницу

Как использовать mod_rewrite для абстрактного получения запроса с поддоменами

Я занимался этим весь день и думал, что разбираюсь в регулярных выражениях, но больше не уверен в этом. Я искал повсюду, прочитал несколько ужасных руководств по mod_rewrite, и я в тупике.

Я хочу сделать так, чтобы звонок

subdomain.domain.com/u/satbirkira 

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

 domain.com/user.php?user_name=satbirkira?subdomain_given=subdomain

Это должно быть очень просто, но я не могу этого понять. Вот что я придумал:

RewriteCond %{HTTP_HOST} ^(.*)user.php\?user_name=(.*)$ [NC]

RewriteRule ^(.*)$ http://%1%{REQUEST_URI}/u/$3

Я понятия не имею, почему некоторые RewriteCond ломаются, если вы удаляете бесполезные точки захвата, такие как первая (. *), Но я научился просто кататься с ней. Я был бы признателен, если бы кто-нибудь объяснил, почему подход неправильный, синтаксис, точки захвата и замена, а также переменные.

редактировать

Это похоже на гол на # 4 на http://roshanbh.com.np/2008/03/url-rewriting-examples-htaccess.html, "4) Переписывая yoursite.com/user.php?username=xyz на yoursite.com/xyz" ожидаю, что ответ не имеет для меня смысла.

Это должно работать:

RewriteCond %{HTTP_HOST}    (.*).domain.com
RewriteRule ^/u/([^/]+)/?$ /user.php?user_name=$1&domain_given=%1 [P]

Вспомните, как сначала проверяется LHS RewriteRule. Затем в RewriteCond LHS сопоставляется с RHS, и, если это совпадает, выполняется подстановка. Строки, которые вы захватываете в правой части RewriteCond, сохраняются в% 1,% 2 и т. Д. Те, которые вы захватываете в левой части RewriteRule в $ +, ä2 и т. Д.

В ?user_name=satbirkira Часть может быть немного сложной для подачи в PHP с перезаписью, в зависимости от того, как PHP обращается к данным - некоторые приложения в конечном итоге получают исходную строку запроса, а не перезаписанную.

Но пока давайте начнем с этого и посмотрим, к чему это приведет. Это должно быть в VirtualHost контекст, если это в <Directory> или .htaccess его нужно будет настроить ..

RewriteRule ^/u/([^/]+)/?$ /user.php?user_name=$1 [L]

Для .htaccess (которые вы не должны использовать!):

RewriteRule ^u/([^/]+)/?$ user.php?user_name=$1 [L]