mod_rewrite: добавить косую черту? - PullRequest
11 голосов
/ 28 июня 2010

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

Ответы [ 4 ]

10 голосов
/ 30 июня 2010

Эта строка:

RewriteCond %{REQUEST_FILENAME} -D

Должно было быть:

RewriteCond %{REQUEST_FILENAME} -d
6 голосов
/ 24 декабря 2013

Не беспокойтесь о Mod Rewrite, для него есть директива

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

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

0 голосов
/ 10 апреля 2013

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

<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>
0 голосов
/ 29 июня 2010

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...