Я пытаюсь получить виртуальный каталог или файл для передачи обратно в index.php
Например, я хочу, чтобы все после / было передано обратно в индекс, который затем будет проверен по базе данных, но «virtual_directory» и «virtual_file.jpg» на самом деле не существуют, они просто параметры.
somedomain.com/virtual_directory
somedomain.com/virtual_file.jpg
Теперь проблема в том, что ВСЕ проходит. Скажем, я просто хочу перейти в основной каталог (или просто index.php), я бы набрал URL (somedomain.com), и он передал бы косую черту в качестве параметра. То же самое происходит, если я пытаюсь перейти на somedomain.com/index.php. Это пройдет с /index.php (то есть: я не могу добраться до оператора else).
Есть ли способ сделать так, чтобы он не проходил, если я прямо иду к индексу?
Эти два будут передаваться в качестве параметра, и я не хочу их тоже.
somedomain.com/
somedomain.com/index.php
.Htaccess:
Options +FollowSymLinks
RewriteEngine on
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule .* /index.php [L]
index.php прочитает то, что было после ‘/’, и что-то с ним сделает.
if ($_SERVER['REQUEST_URI']) {
echo nl2br("Parameter Passed!\n");
echo 'Parameter That Passed:' .$_SERVER['REQUEST_URI'];
} else{
echo 'No Parameter Passed';
echo 'You Are Visiting domain.com/ or domain.com/index.php';
}
Причина того, что часть «else» вашего php-кода не достигается, заключается в том, что всегда будет $_SERVER['REQUEST_URI']
значение. Это переменная сервера, которая всегда будет запрос. Таким образом, вы никогда не получите «параметр не передан». Вместо этого вы можете захотеть передать параметр как переменную GET или как PATH INFO:
Options +FollowSymLinks
RewriteEngine on
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)$ /index.php?request=$1 [L]
и ваш код будет:
if ($_GET['request']) {
echo nl2br("Parameter Passed!\n");
echo 'Parameter That Passed:' .$_GET['request'];
} else{
echo 'No Parameter Passed';
echo 'You Are Visiting domain.com/ or domain.com/index.php';
}
или pathinfo:
Options +FollowSymLinks
RewriteEngine on
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)$ /index.php/$1 [L]
и ваш код будет:
if ($_SERVER['PATH_INFO']) {
echo nl2br("Parameter Passed!\n");
echo 'Parameter That Passed:' .$_SERVER['PATH_INFO'];
} else{
echo 'No Parameter Passed';
echo 'You Are Visiting domain.com/ or domain.com/index.php';
}
Вы можете попробовать это
<IfModule mod_rewrite.c>
<IfModule mod_negotiation.c>
Options -MultiViews
</IfModule>
RewriteEngine On
RewriteRule ^(.*)/$ /$1 [L,R=301]
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^ index.php [L]
</IfModule>