.htaccess — htaccess — mod_rewrite передать виртуальный каталог или файл обратно в index.php в качестве параметра?

Я пытаюсь получить виртуальный каталог или файл для передачи обратно в 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';
}

3

Решение

Причина того, что часть «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';
}
1

Другие решения

Вы можете попробовать это

 <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>
0

По вопросам рекламы [email protected]