Я только что переместил веб-сайт из одной хостинговой компании в другую.
На исходном хосте у меня может быть 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 или что-то вроде этого. Однако у меня нет доступа к ним на исходном хосте.
Я могу разобраться в обходных решениях, но я хочу попробовать и заставить новый сервер действовать как оригинал.
Это вызвано 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]