2014-01-28 2 views
1

У меня есть index.php-контроллер, к которому перенаправляются все URL-адреса, к которым не привязаны существующие файлы. Правила .htaccess я в настоящее время выглядит следующим образом:Удаление index.php из URLS с .htaccess

RewriteEngine On 
DirectorySlash Off 

# Remove Trailing Slashes 
RedirectMatch 302 ^(.*)/$ $1 

# Remove WWW 
RewriteCond %{HTTP_HOST} ^www\.(.+)$ [NC] 
RewriteRule^http://%1%{REQUEST_URI} [R=302] 

# Reroute to index.php 
RewriteCond %{REQUEST_FILENAME} !-f 
RewriteCond %{REQUEST_FILENAME} !-d 
RewriteRule ^(.*)$ index.php/$1 [L,QSA] 

То, что я хочу сделать, это использовать 301 редирект, если index.php включен в URL. НО! Я не могу использовать RewriteBase или запросы, которые начинаются с косой черты, потому что webapp, который я разрабатываю, может быть в подпапке. Поэтому в основном, я хочу только переписать для текущего каталога:

example.com/foo/index.php/bar/whatever необходимо перенаправить на example.com/foo/bar/whatever example.com/foo/index/bar/any также следует перенаправить на example.com/foo/bar/whatever

localhost/place/foo/index.php/bar/все, что нужно перенаправить на localhost/place/foo/bar/whatever localhost/place/foo/index/bar/что угодно также следует перенаправить на localhost/place/foo/bar/whatever

Как это сделать с помощью .htaccess?

ОБНОВЛЕНО КОД: Все здесь работает КРОМЕ: index.php не удаляется из любого места в URL.

Вот код:

<IfModule mod_rewrite.c> 
RewriteEngine On 
DirectorySlash Off 

# Remove WWW 
RewriteCond %{HTTP_HOST} ^www\.(.+)$ [NC] 
RewriteRule^http://%1%{REQUEST_URI} [R=302,L] 

# Remove Trailing Slashes 
RewriteCond %{REQUEST_FILENAME} !-d 
RewriteCond %{THE_REQUEST} \s(.+?)/+[?\s] 
RewriteRule^%1 [R=302,L] 

# Reroute to index.php 
#RewriteCond $1 !^(index\.php) 
RewriteCond %{REQUEST_FILENAME} !-f 
RewriteCond %{REQUEST_FILENAME} !-d 
RewriteRule ^(.*)$ index.php?cURL=/$1 [L,QSA] 

</IfModule> 

ответ

2

Не очень хорошая идея смешивать правила mod_rewrite с mod_alias из них. Попробуйте это обновленный .htaccess:

<IfModule mod_rewrite.c> 
RewriteEngine On 
DirectorySlash Off 

# Remove WWW 
RewriteCond %{HTTP_HOST} ^www\.(.+)$ [NC] 
RewriteRule^http://%1%{REQUEST_URI} [R=302,L] 

# Remove Trailing Slashes 
RewriteCond %{REQUEST_FILENAME} !-d 
RewriteCond %{THE_REQUEST} \s(.+?)/+[?\s] 
RewriteRule^%1 [R=302,L] 

# remove index.php 
RewriteCond %{THE_REQUEST} /index\.php[\s?/] [NC] 
RewriteRule ^(.*?)index\.php(/.*)?/?$ /$1$2 [L,R=301,NC,NE] 

# Reroute to index.php 
RewriteCond $1 !^(index\.php) 
RewriteCond %{REQUEST_FILENAME} !-f 
RewriteCond %{REQUEST_FILENAME} !-d 
RewriteRule ^(.*)$ index.php?cURL=/$1 [L,QSA] 
</IfModule> 
+0

С example.com/index.php/ foo/Я получаю example.com//foo/ и с example.com/foo/index.php/foo/bar/ Я получаю example.com//foo/bar/ И без завершающего косая черта (который URL-адреса I роды ting не имеют) Я получаю цикл переадресации. – Michelle

+0

См. Обновление сейчас, для 'http: // localhost/foo/index.php/foo/bar' Я получаю' http: // localhost/foo/foo/bar' – anubhava

+0

Убедитесь, что это правило является вашим первым правилом. – anubhava

1

Убедитесь, что мод рерайт на на сервере попробовать

RewriteEngine on 
RewriteCond $1 !^(index\.php) 
RewriteCond %{REQUEST_FILENAME} !-f 
RewriteCond %{REQUEST_FILENAME} !-d 
RewriteRule ^(.*)$ index.php?/$1 [L] 
+0

Это, кажется, работает на все ... кроме удаления трейлинг-косых черт. Я получаю строку запроса того же URL-адреса, когда он удаляет косую черту. IE: example.com/test/123/456/ становится example.com/test/123/456?/test/123/456/ – Michelle

0

Вы можете использовать как этот

RewriteEngine On 
RewriteCond %{REQUEST_FILENAME} !-f 
RewriteCond %{REQUEST_FILENAME} !-d 
RewriteRule ^(.*)$ index.php?/$1 [L] 
Смежные вопросы