URL включает в себя подкаталог при использовании rewriterule

0

Я только что переместил веб-сайт из одной хостинговой компании в другую.

На исходном хосте у меня может быть URL-адрес, например site.com/staff, и это фактически вызовет index.php? Page = staff, используя RewriteRule. Это будет работать, даже если у этого хоста был подкаталог с именем персонала. Это касается не только страницы персонала, но и других.

На новом хосте, если я вызываю site.com/staff и есть подкаталог сотрудников, я получаю URL-адрес, например: site.com/staff?page=staff в адресной строке.

Я использую тот же.htaccess на обоих хостах.

Options +FollowSymLinks
RewriteEngine On

RewriteRule ^print/([^/\.]+)/?$ /print.php?page=$1 [R,NC,L]
RewriteRule ^([^/\.]+)[/]$ /$1 [NC,R]
RewriteRule ^([^/\.?]+)$ /index.php?page=$1 [NC,L]

Я думаю, что это может быть настройка в vhost.conf, httpd.conf или что-то вроде этого. Однако у меня нет доступа к ним на исходном хосте.

Я могу разобраться в обходных решениях, но я хочу попробовать и заставить новый сервер действовать как оригинал.

Теги:
.htaccess
mod-rewrite

1 ответ

0
Лучший ответ

Это вызвано mod_dir и DirectorySlash. По умолчанию apache перенаправляет любой запрос для каталога (независимо от правил перезаписи), который пропускает конечную косую черту с тем же запросом с завершающей косой чертой. Это значит, что люди не могут заглянуть в содержимое ваших каталогов. Если вам не хватает конечной косой черты, содержимое каталога становится открытым независимо от того, есть ли у вас индексный файл или нет. Это перенаправление игнорирует любые возможные правила перезаписи, которые могут применяться.

Что вам нужно сделать, так это обработать конечную косую черту в mod_rewrite и отключить mod_dir:

DirectorySlash Off

Options +FollowSymLinks
RewriteEngine On

RewriteRule ^print/([^/\.]+)/?$ /print.php?page=$1 [R,NC,L]
RewriteRule ^([^/\.]+)[/]$ /$1 [NC,R]
RewriteRule ^([^/\.?]+)$ /index.php?page=$1 [NC,L]

# in case there a request for a directory that hasn't been handled
RewriteCond %{REQUEST_FILENAME} -d
RewriteRule ^(.*[^/])$ /$1/ [L]
  • 0
    Добавление DirectorySlash Off решило мою проблему. Как я могу установить это для всех сайтов на этом сервере?
  • 0
    @JohnMason, вам нужно сделать это через конфигурацию сервера, просто имейте в виду, что содержимое каталога будет открыто, если вы не уверены, что к ним нельзя получить доступ.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню