ОБНОВЛЕНИЕ: Решение внизу.
Недавно я отказался от настройки, такой как 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=something&o=something_else, был перенаправлен на /something/something_else. Любая идея, как я могу это сделать? P&O может идти в любом порядке, и одно или другое может не существовать.
РЕДАКТИРОВАТЬ: Хорошо, после помощи @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.
РЕДАКТИРОВАТЬ:
Теперь он перенаправляется правильно, но по какой-то причине он удаляет папку /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]