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

147
9

Я использую файл .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>

спросил(а) 2021-01-19T10:57:13+03:00 6 месяцев, 2 недели назад
1
Решение
134

Вздох.


Эта строка:


RewriteCond %{REQUEST_FILENAME} -D

Должно быть:


RewriteCond %{REQUEST_FILENAME} -D

ответил(а) 2021-01-19T10:57:13+03:00 6 месяцев, 2 недели назад
100

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


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

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

ответил(а) 2021-01-19T10:57:13+03:00 6 месяцев, 2 недели назад
45

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


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 будет загружать только условия и правила один раз. По крайней мере, мне посоветовали сделать это из-за этого.

ответил(а) 2021-01-19T10:57:13+03:00 6 месяцев, 2 недели назад
46

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


<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>

ответил(а) 2021-01-19T10:57:13+03:00 6 месяцев, 2 недели назад
Ваш ответ
Введите минимум 50 символов
Чтобы , пожалуйста,
Выберите тему жалобы:

Другая проблема