Использование mod_rewrite для 301 перенаправления get vars на новые чистые URL - PullRequest
0 голосов
/ 08 февраля 2012

ОБНОВЛЕНИЕ: решение внизу.

Я недавно переключился с использования настройки, такой как index.php?p=page_name&o=temporary_override, и переключился на чистые URL, такие как /page_name/temporary_override. Временное переопределение только для того, чтобы я мог видеть результаты изменений сайта во время его создания.

В настоящее время у меня установлен mod_rewrite:

RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)$ index.php?GHPAGE=$1 [L,QSA]

, который будет захватывать «подкаталоги», а затем PHP анализирует URL из переменной GHPAGE $ _GET. Я хочу настроить перенаправление 301, чтобы любой, кто использует index.php? P = что-то & o = something_else, был перенаправлен на /thing / something_else. Есть идеи, как мне это сделать? П / о может быть в любом порядке, и один или другой может не существовать.

РЕДАКТИРОВАТЬ: Хорошо, после помощи @ Jon-Lin, @dambrisco и @anubhava, я стал ближе. Мой файл .htaccess теперь выглядит так:

RewriteEngine On
#Base Directory
RewriteBase /test/

#if 2 GET Vars
RewriteCond %{THE_REQUEST} ^([A-Z]{3,9})\ \/([^\/]+\/)*(index\.php)?\?[op]=([^&]+)&[op]=(.+)\ HTTP\/
RewriteRule ^index\.php$ /%4/%5 [R=301,L]
#if 1 GET Var
RewriteCond %{THE_REQUEST} ^([A-Z]{3,9})\ \/([^\/]+\/)*(index\.php)?\?[op]=(.+)\ HTTP\/
RewriteRule ^index\.php$ /%4 [R=301,L]
#Remove index.php
RewriteCond %{THE_REQUEST} ^([A-Z]{3,9})\ \/([^\/]+\/)*index\.php\ HTTP\/
RewriteRule ^index\.php$ / [R=301,L]

RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)$ index.php?GHPAGE=$1 [L,QSA]

Теперь оно перенаправляет, но не совсем туда, куда нужно. root/test/index.php?p=test&o=override теперь перенаправляет на root/test/override?p=test&o=override. Ближе, но я не могу понять, как избавиться от переменных GET, которые добавляются в URL, или почему он перенаправляет в корневой каталог, а не в каталог RewriteBase.

EDIT:

Теперь оно перенаправлено правильно, но по какой-то причине оно удаляет папку / test / RewriteBase из уравнения. http://www.domain.com/test/index.php?p=page1&o=operation перенаправляется на http://www.domain.com/page1/operation. Новый файл .htaccess находится ниже:

RewriteEngine On

RewriteBase /test/

#if 2 GET Vars
RewriteCond %{THE_REQUEST} ^([A-Z]{3,9})\ /([^/]+/)*(index\.php)?\?[op]=([^&]+)&[op]=(.+)\ HTTP\/
RewriteRule ^ /%4/%5? [R=301,L]

#if 1 GET Var
RewriteCond %{THE_REQUEST} ^([A-Z]{3,9})\ /([^/]+/)*(index\.php)?\?[op]=(.+)\ HTTP\/
RewriteRule ^ /%4? [R=301,L]

#if index.php
RewriteCond %{THE_REQUEST} ^([A-Z]{3,9})\ \/([^\/]+\/)*index\.php\ HTTP\/
RewriteRule ^index\.php$ /$ [L,R=301]

RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)$ index.php?GHPAGE=$1 [L,QSA]

Спасибо всем. Вопрос был решен. Финальный .htaccess ниже для справки.

RewriteEngine On

RewriteBase /test/

#if 2 GET Vars
RewriteCond %{THE_REQUEST} ^([A-Z]{3,9})\ /([^/]+/)*(index\.php)?\?[op]=([^&]+)&[op]=(.+)\ HTTP\/
RewriteRule ^ %4/%5? [R=301,L]

#if 1 GET Var
RewriteCond %{THE_REQUEST} ^([A-Z]{3,9})\ /([^/]+/)*(index\.php)?\?[op]=(.+)\ HTTP\/
RewriteRule ^ %4? [R=301,L]

#if index.php
RewriteCond %{THE_REQUEST} ^([A-Z]{3,9})\ \/([^\/]+\/)*index\.php\ HTTP\/
RewriteRule ^index\.php$ ? [L,R=301]

RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)$ index.php?GHPAGE=$1 [L,QSA]

Ответы [ 3 ]

0 голосов
/ 09 февраля 2012

Вы захотите использовать следующее:

RewriteRule ^([^/]+)/?$ index.php?p=$1 [L,QSA]
RewriteRule ^([^/]+)/([^/]+)/?$ index.php?p=$1&o=$2 [L,QSA]

Таким образом, example.com/page_name будет внутренне передано index.php?p=page_name, а example.com/page_name/operation передано index.php?p=page_name&o=operation.Кажется, что ответ Джона Линя был противоположным, чего я не заметил прошлой ночью.

Не должно быть никакой необходимости в каких-либо RewriteConds, кроме как во избежание конфликта с другими правилами, которые могут у вас быть, просто дляуточнения.

0 голосов
/ 09 февраля 2012

Изменение 2 ваших строк RewriteRule должно заканчиваться на ? следующим образом:

#if 2 GET Vars
RewriteCond %{THE_REQUEST} ^([A-Z]{3,9})\ /([^/]+/)*(index\.php)?\?[op]=([^&]+)&[op]=(.+)\ HTTP\/
RewriteRule ^ /%4/%5? [R=301,L]

#if 1 GET Var
RewriteCond %{THE_REQUEST} ^([A-Z]{3,9})\ /([^/]+/)*(index\.php)?\?[op]=(.+)\ HTTP\/
RewriteRule ^ /%4? [R=301,L]
0 голосов
/ 08 февраля 2012

Добавьте это где-нибудь в вашем htaccess:

RewriteCond %{THE_REQUEST} ^([A-Z]{3,9})\ /index\.php\?p=([^&]+)&o=(.+)\ HTTP
RewriteRule index.php /%2/%3 [R=301,L]

И если вы хотите охватить случай, когда нет «временного_обмена», добавьте это тоже:

RewriteCond %{THE_REQUEST} ^([A-Z]{3,9})\ /index\.php\?p=(.+)\ HTTP
RewriteRule index.php /%2 [R=301,L]

Ближе, но я не могу понять, как избавиться от переменных GET, которые добавляются в URL, или почему он перенаправляется в корневой каталог вместо каталога RewriteBase

Добавьте ? в конце /%4/%5, чтобы избавиться от строки запроса.И удалите ведущий / из /%4/%5, чтобы он не переписывался в корень.Так, например, одно из ваших правил должно выглядеть так:

RewriteCond %{THE_REQUEST} ^([A-Z]{3,9})\ \/([^\/]+\/)*(index\.php)?\?[op]=([^&]+)&[op]=(.+)\ HTTP\/
RewriteRule ^index\.php$ %4/%5? [R=301,L]
...