2015-06-25 5 views
2

Я строю сайт, используя Slim, который предлагает следующие .htaccess код для создания красивых URL-адресов:301 перенаправления URL-адреса, которые также переписаны

RewriteCond %{REQUEST_FILENAME} !-f 
RewriteRule^index.php [QSA,L] 

Это означает, что URL, как http://example.com/account/login будет псевдоним для http://example.com/index.php/account/login , который затем обрабатывается моим фронтальным контроллером. Все идет нормально.

Однако, если кто-то явно переходит к

http://example.com/index.php/account/login,

Я хотел бы, чтобы первый перенаправить на:

http://example.com/account/login,

и затем псевдоним для

http://example.com/index.php/account/login.

Таким образом, пользователь увидит http://example.com/account/login в своей навигационной панели.

Как я могу обрабатывать оба этих правила одновременно в .htaccess и, самое главное, без жесткого кодирования хоста и домена (http://example.com) в .htaccess?

Это также должно работать в подкаталоге, например:

http://example.com/site1/index.php/account/login -> http://example.com/site1/account/login

С файлом .htaccess находится в site1 директории относительно корня документа, и без явного ставить site1 в .htaccess.

ответ

2

Вам необходимо новое правило переадресации перед этим правилом:

RewriteEngine On 

RewriteCond $0#%{REQUEST_URI} ^([^#]*)#(.*)\1$ 
RewriteRule ^.*$ - [E=BASE:%2] 

RewriteCond %{THE_REQUEST} /index\.php [NC] 
RewriteRule ^index\.php(?:/(.*))?$ %{ENV:BASE}$1 [L,R=302,NC,NE] 

RewriteCond %{REQUEST_FILENAME} !-f 
RewriteCond %{REQUEST_FILENAME} !-d 
RewriteRule^index.php [L] 
+0

Хм, я видел ваш ответ в другом вопросе, но, похоже, он не работает для меня. Если у меня есть '^' в начале шаблона «RewriteRule», разве это не попытка сопоставить URL с самого начала? – alexw

+2

Этот ответ на самом деле правильный - не уверен, что вы подразумеваете под совпадением URL-адреса в самом начале ... Это просто не перенаправление? –

+1

Это работает для чего-то вроде http: // localhost/index.php/blah', но не 'http: // localhost/site1/index.php/blah' (предполагая, что мой файл' .htaccess' находится в '/site1' относительно моего корня документа). – alexw

1

попробовать это:

RewriteRule ^index\.php/(.*)$ /$1 [R=301,L] 

RewriteCond% {REQUEST_FILENAME} -f

RewriteRule^index.php [QSA, L]

+1

Вы бы подумали, что это будет так просто, но увы ... нет :( – alexw

+0

Я тестировал его на своем местном, это было рабочий тон – bignick