Рекурсивно обрабатывать параметры запроса с помощью htaccess - PullRequest
1 голос
/ 29 февраля 2012

Я снова здесь с просьбой переписать URL :(.Я использую htaccess для переписывания, ниже приведен мой код htaccess:

RewriteEngine On
RewriteBase /

RewriteCond %{ENV:REDIRECT_STATUS} 200
RewriteRule ^ - [L]

RewriteCond %{REQUEST_URI} !-f 
RewriteCond %{REQUEST_URI} !\.\w+$
RewriteCond %{REQUEST_URI} !/$ 
RewriteRule (.*) /$1/ [R,L]

RewriteCond %{REQUEST_URI} ^/([\w\d-]+)/$ [NC]
RewriteRule ^ /?file_name=%1 [L,QSA]

RewriteCond %{QUERY_STRING} !^$
RewriteCond %{QUERY_STRING} (?:(.*)&)?file_name=([\w\d-]+)(.*) [NC]
RewriteRule ^ %2/?%1%3 [L,R]

Прежде чем задавать свои вопросы, позвольте мне дать вам краткое объяснение о том, как работает вышеуказанный код.У меня есть URL-адрес типа http://www.mysite.com/ (для индекса) , и другие страницы могут быть выполнены с помощью параметра с именем file_name = page_name, например http://www.mysite.com/?file_name=my_blog. Мой htaccess помогает мне исключитьПараметр file_name и создайте новый URL-адрес, например http://www.mysite.com/my_blog/.

Теперь у меня есть запрос:

  1. Сейчас уже есть параметр file_name и теперь я хочу дать дополнительные параметры, такие как http://www.mysite.com/?file_name=my_blog&blog_alias=welcome-to-new-generation и хотел, чтобы это выглядело как http://www.mysite.com/my_blog/welcome-to-new-generation/. Так что, если я добавлю любое количество параметров, там имя параметра должно быть удалено, и только значение параметра будет поставлено с косой чертой. Обратите внимание: Имя параметра может быть любым.

Пожалуйста, пожалуйста, помогите.

1 Ответ

1 голос
/ 29 февраля 2012

Это очень интересная проблема, требующая рекурсивной реализации правил mod_rewrite. Поместите этот код в ваш .htaccess:

Обновление II В соответствии с дальнейшими комментариями перенаправляет /?file_name=my_blog&blog_alias=welcome-to-new-generation&foo=bar&n=v URI на /file_name+my_blog/blog_alias+welcome-to-new-generation/foo+bar/n+v

Options +FollowSymLinks -MultiViews
# Turn mod_rewrite on
RewriteEngine On
RewriteBase /

# forwards ?file_name=my_blog&blog_alias=welcome-to-new-generation to
# /file_name=my_blog&blog_alias=welcome-to-new-generation
RewriteCond %{THE_REQUEST} ^[A-Z]{3,}\s/+\?([^\s]+)\s [NC]
RewriteRule ^$ %1? [L]

# redirects /file_name=my_blog&blog_alias=welcome-to-new-generation&foo=bar&n=v
# to /file_name+my_blog/blog_alias+welcome-to-new-generation/fo+barn+/v    
RewriteRule ^(.*/)?([^=]+)=([^&]+)&(.*)$ $1$2+$3/$4 [L]
RewriteRule ^(.*/)?([^=]+)=(.*)$ $1$2+$3 [L,R]

# internal forward from /file_name+my_blog/blog_alias+welcome-to-new-generation to
# /?file_name=my_blog&blog_alias=welcome-to-new-generation
RewriteRule ^([^\+]+)\+([^/]+)/(.*)$ $3?$1=$2 [L,QSA]
RewriteRule ^([^\+]+)\+([^/]+)/?$ /?$1=$2 [L,QSA]

Как только вы убедитесь, что он работает, измените R на R=301

...