ОБНОВЛЕНИЕ: решение внизу.
Я недавно переключился с использования настройки, такой как 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]