2014-01-30 8 views
1

Я написал следующий код в моем файле Htaccess:Перенаправление на index.php в корне

RewriteRule ^(.*)/$ $1 
RewriteCond %{REQUEST_URI} !^index.php.*$ 
RewriteRule ^(.*)$ /index.php?route=$1 [END] 

Он работает отлично подходит для каждого пути, для каталогов, которые существуют за исключением. Например, если я вхожу в http://localhost/profilepic, и такой каталог действительно существует, он перенаправляет на http://localhost/profilepic/?route=profilepic, но я хочу, чтобы он был неявно преобразован в http://localhost/index.php?route=profilepic.

Заранее спасибо.

ответ

1

Причина в том, что это происходит из-за mod_dir and the DirectorySlash directive. По сути, если он видит URI без конечной косой черты и сопоставляется с существующим каталогом, он перенаправляет запрос так, чтобы он имел завершающую косую черту. Поскольку mod_dir и mod_rewrite находятся в разных местах в конвейере обработки URL-файлов, как mod_dir, так и mod_rewrite применяются к одному и тому же URL-адресу. Вот почему вы получаете перенаправление и странный URL-адрес с строкой запроса.

Если у вас обязательно должны быть каталоги без косых черт, вам необходимо повернуть DirectorySlash. Проблема с его отключением заключается в том, что существует проблема безопасности раскрытия информации, которая заставит людей заглядывать в содержимое каталога , даже если у вас есть индексный файл. Это означает, что вам нужно компенсировать mod_dir с помощью mod_rewrite.

Так избавиться от правила:

RewriteRule ^(.*)/$ $1 

и заменить его с этими правилами:

DirectorySlash Off 

# redirect direct requests that end with a slash to remove the slash. 
RewriteCond %{THE_REQUEST} \ /+[^\?\ ]+/($|\ |\?) 
RewriteRule ^(.*)/$ /$1 [L,R] 

# internally add the trailing slash for directories 
RewriteCond %{REQUEST_FILENAME} -d 
RewriteRule ^(.*[^/])$ /$1/ [L] 
+0

Thanks Jon! Это решило проблему;) – Javid

1

Вот еще один способ, которым Вы можете иметь свои правила, не выключая DirectorySlash (считается дыра в безопасности):

RewriteEngine On 

# remove trailing slash for non-directories 
RewriteCond %{REQUEST_FILENAME} !-d 
RewriteCond %{THE_REQUEST} \s(.+?)/+[?\s] 
RewriteRule ^(.+?)/$ /$1 [R=301,L] 

# routing for directories 
RewriteCond %{REQUEST_FILENAME} !-f 
RewriteCond %{REQUEST_FILENAME} -d 
RewriteRule ^(.+?)/$ /index.php?route=$1 [L] 

# routing for non directories 
RewriteCond %{REQUEST_FILENAME} !-f 
RewriteCond %{REQUEST_FILENAME} !-d 
RewriteRule ^(.+?)/?$ /index.php?route=$1 [L] 
+0

+1 для этого приятного решения. Tnx. Кстати, что означает L? – Javid

+1

L следует пометить правило как «Последнее», которое повторно вводит переписанный URL-адрес в mod_rewrite engine. – anubhava

Смежные вопросы