Переписать правила, отображаемые в адресной строке браузера - PullRequest
1 голос
/ 06 января 2010

У меня есть следующие правила переписывания:

<IfModule mod_rewrite.c>
  RewriteEngine on
  RewriteBase /

  # Route all URLs to dispatch.php.
  RewriteCond %{REQUEST_URI} !media/
  RewriteRule ^(.*)$ dispatch.php [L]

  #Route requests to /media/* to /project/media/*
  RewriteRule ^media/(.*)?$ project/media/$1 [L]

</IfModule>

Все переписывается в dispatch.php, если только URI не начинается с media/, в этом случае он перезаписывает URI в project/media/*. Все работает нормально, и если я перейду к example.com/media/css/style.css таблице стилей, которую он обслуживал. Если я перехожу на example.com/media/css/, то отправляется ошибка 403 Forbidden. Отлично!

Однако, если я перейду к example.com/media/css (пропуская завершающий символ '/'), то URL-адрес в строке адреса переписывается на example.com/project/media/css, а запрос обрабатывается dispatch.php. Как мне остановить это поведение? Я бы хотел, чтобы он обрабатывался dispatch.php, но без добавления projects/ в URL.

Решено: Проблема заключалась в том, что mod_dir перенаправлял URL-адреса без косой черты. Это привело к тому, что расположение на диске используется для перенаправления, что означает, что подпапка (проект) была добавлена ​​к URI. Окончательный .htaccess, который я использовал, выглядит следующим образом:

Options +FollowSymLinks +MultiViews -Indexes
Options -Indexes

<IfModule mod_dir.c>
  DirectorySlash Off
</IfModule>

<IfModule mod_rewrite.c>
  RewriteEngine on
  RewriteBase /

  #Add trailing slashes
  RewriteCond %{REQUEST_URI} !(.*)/$
  RewriteCond %{REQUEST_FILENAME} !-f
  RewriteRule ^(.*)$ $1/ [R=301,L]

  #Route requests to /media/* to /project/media/*
  RewriteRule ^media(/.*)$ project/media$1 [L]

  # Route all URLs to dispatch.php.
  RewriteCond %{REQUEST_URI} !^media/(.*)
  RewriteRule ^(.*)$ dispatch.php [L]

</IfModule>

Новый .htaccess делает то же, что и раньше, а также:

  • Отключает mod_dir.
  • Добавляет косые черты в URI с помощью RewriteRule.

1 Ответ

1 голос
/ 06 января 2010

Вы можете явно заблокировать эти URL-адреса каталогов с помощью других правил перезаписи.

Или ... Вы можете использовать DirectorySlash, чтобы отключить перенаправление.

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

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