Подтвердить что ты не робот

Mod_rewrite: добавить конечную косую черту?

Я использую файл .htaccess, чтобы направлять запросы к каталогу в настраиваемый php файл, который предоставляет информацию об этом каталоге (и я хочу, чтобы URL-адрес, отображаемый браузером, не изменялся).

Вот соответствующая часть файла .htaccess.

RewriteCond %{REQUEST_FILENAME} -d
RewriteRule ^(.*)$ /myphp.php?url=%{REQUEST_URI} [QSA,L] 

Это хорошо работает, если вы перейдете в каталог и включите конечную косую черту:

http://domain.com/path/

Но без конечной косой черты это не

http://domain.com/path

URL-адрес (показано в браузере) превращается в:

http://localhost:8888/path/?url=/path

Я попытался исправить это, добавив правило выше этого правила:

RewriteCond %{REQUEST_FILENAME} -D
RewriteCond %{REQUEST_URI} !(.*)/$
RewriteRule ^(.*)$ $1/ [L]

Но это не работает для меня.

Как я могу получить .htaccess для добавления конечной косой черты, если она опущена, а затем действовать так, как если бы она была там?

Спасибо

Обновление: В соответствии с просьбой, вот что все.

<IfModule mod_rewrite.c>
RewriteEngine On

#force trailing slashes on real directories
RewriteCond %{REQUEST_FILENAME} -D
RewriteCond %{REQUEST_URI} !(.*)/$
RewriteRule ^(.*)$ $1/ [L]

#use the directory viewer on directories without an index page
RewriteCond %{REQUEST_FILENAME} -d
RewriteRule ^(.*)$ /myphp.php?url=%{REQUEST_URI} [QSA,L]  

</IfModule>
4b9b3361

Ответ 1

Вздох.

Эта строка:

RewriteCond %{REQUEST_FILENAME} -D

Должно быть:

RewriteCond %{REQUEST_FILENAME} -D

Ответ 2

Не беспокоитесь о перезаписи мод, для него есть директива

<Location /some/path>
  DirectorySlash On
  SetHandler some-handler
</Location>

http://httpd.apache.org/docs/2.2/mod/mod_dir.html

Ответ 3

Вы имели в виду

RewriteRule ^(.*)$ $1/ [L]

вместо

Я не знаю о вашем подходе. Я бы попробовал что-то вроде

RewriteRule ^/(\S+)/?$ /myphp.php?url=$1

Я использовал это для перезаписи раньше, и он работает:

RewriteEngine on
RewriteCond %{HTTP_HOST} ^domain\.com
RewriteRule ^(.*)$ http://www.domain.com$1
RewriteRule ^/(\S+)/?$ /myphp.php?url=$1

Обратите внимание, что в первом правиле я не включал конечную косую черту.

Кроме того, я бы посоветовал вам не полагаться на .htaccess, если это абсолютно необходимо. Это связано с тем, что сервер будет постоянно проверять файлы .htaccess. Использование файла httpd.conf вместо этого означает, что apache будет загружать только условия и правила один раз. По крайней мере, мне посоветовали сделать это из-за этого.

Ответ 4

Попробуйте это. Он добавит конечную косую черту в запросы каталога, у которых нет косой черты.

<IfModule mod_rewrite.c>
RewriteEngine On

#use the directory viewer on directories without an index page
RewriteCond %{REQUEST_FILENAME} -d
RewriteRule ^(.*?)/?$ /myphp.php?url=$1/ [QSA,L]  

</IfModule>