Правило перезаписи не работает без завершающего слеша - PullRequest
1 голос
/ 28 февраля 2012



У меня есть рабочее правило перезаписи, чтобы скрыть index.php? Dir = от URL.
Так, например, если я пытаюсь

www.example.com/folder/dir1/

, оно переписывается в

www.example.com/folder/index.php?dir=dir1/

и это нормально!

Беда в том, что если я удаляю косую черту из URL, т.е.

www.example.com/folder/dir1

, она входит в цикл перенаправления!

Мой завершен Доступ:

Options +FollowSymLinks 

RewriteEngine On
RewriteBase /folder

RewriteCond %{ENV:REDIRECT_STATUS} 200
RewriteRule .* - [L]

RewriteCond %{QUERY_STRING}  ^dir=(.*)$ [NC]
RewriteRule ^ %1? [L,R=301,NE]

RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} -d

RewriteRule ^(.+)/? index.php?dir=$1 [L,QSA]

Пожалуйста, совет?

Ответы [ 2 ]

1 голос
/ 28 февраля 2012

(i) Я смущен по поводу RewriteBase /papers.Это имеет смысл только в DOCROOT/papers/.htaccess.Если это место и есть «папка» == документы?Если нет, то я не удивлен, что движок переписывания запутывается.(ii) `% {REDIRECT_STATUS} не равно 200 при поиске подзапроса для оценки значения по умолчанию, если MultiViews или DirectoryIndex совпадают.

Поэтому прежде чем делать что-либо еще:

  • Подтвердитечто ваша база верна, и если нет, то исправьте.
  • Используйте Options -MultiViews, если вы их не используете.
  • Проверьте вашу систему, конфигурацию vhost и DOCROOT/.htaccess, чтобы увидеть, еслиDirectoryIndex указано.(В отличие от правил перезаписи, которые берутся только из самых низких .htaccess, все сканируются на наличие таких директив, как этот.)
  • Замените RewriteCond %{ENV:REDIRECT_STATUS} 200 на

     RewriteCond %{ENV:REDIRECT_END}%{IS_SUBREQ} true
    

    идобавьте флаг E=END:true к любым правилам, которые вы хотите принудительно завершить цикл как совпадение (аналогично флагу Apache 2.4 [END]). Дополнительный% {IS_SUBREQ} предотвращает запуск правил в подзапросе.Вы не хотите, чтобы это произошло, если вы действительно не знаете, что делаете.

0 голосов
/ 28 февраля 2012

Разобрался!

Пришлось заменить

RewriteRule ^(.+)/? index.php?dir=$1 [L,QSA]

на

RewriteRule ^(.*)? index.php?dir=$1/ [L,QSA]

Спасибо всем за помощь ..

...