Динамическая перезапись URL с помощью PHP в корневых и некорневых каталогах - PullRequest
0 голосов
/ 19 марта 2011

Для моей программы я использую динамическое переписывание URL с помощью PHP:

<IfModule mod_rewrite.c>
    RewriteEngine On
    RewriteBase /
    #Rewrite the URI if there is no file or folder
    RewriteCond %{REQUEST_FILENAME} !-f
    RewriteCond %{REQUEST_FILENAME} !-d
    #rewrite all to index.php
    RewriteRule ^(.*)$ index.php?/$1 [L]
</IfModule>

В PHP я затем разбиваю URL на разные части. Например, http://myhost/foo/bar возвращает foo bar. У меня проблема, если программа не находится в корневом каталоге сервера, например, http://myhost/this/is/a/folder/hereistheprogram/foo/bar, потому что тогда скрипт возвращает this is a folder hereistheprogram foo bar. Теперь проблема в том, что я не могу различить папки и параметры URL.

Ответы [ 2 ]

2 голосов
/ 19 марта 2011

Вам необходимо знать, каков путь к файлу скрипта.Вы можете сделать это, явно объявив префикс пути или определив его автоматически, например:

$basePath = dirname($_SERVER['SCRIPT_NAME']);

Затем вы можете использовать этот префикс и убрать его из пути URI запроса:

if (substr($requestPath, 0, strlen($basePath)+1) === $basePath.'/') {
    $path = substr($requestPath, strlen($basePath));
} else {
    $path = $requestPath;
}

Кстати: было бы лучше, если бы вы не передавали путь URI запроса явно в index.php , а извлекали его из $_SERVER['REQUEST_URI']:

$_SERVER['REQUEST_URI_PATH'] = parse_url($_SERVER['REQUEST_URI'], PHP_URL_PATH);
$_SERVER['REQUEST_URI_QUERY'] = parse_url($_SERVER['REQUEST_URI'], PHP_URL_QUERY);

И соответствующее правило mod_rewrite:

RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)$ index.php [L]
1 голос
/ 19 марта 2011

Не слишком уверен в точной проблеме, но ..

Не могли бы вы использовать постоянный идентификатор 'foo', используемый в URL-адресах, чтобы определить, где разбить строку?

...