Я использую Apache 2.2.11
.htaccess
RewriteEngine on
RewriteBase /
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME}.php -f
RewriteRule ^(.*)$ $1.php [L,QSA]
Эта проблема: http://localhost/index
дает мне домашнюю страницу (index.php) правильно, но я также могу получить доступ к той же странице по следующим URL-адресам.
http://localhost/index/
http://localhost/index/blahblah
http://localhost/index/blahblah/blah/blah/blah
http://localhost/index.php/
http://localhost/index.php/blahblah/
http://localhost/index.php/blahblah/blah/blah
Я хочу убедиться, что только localhost / index откроет localhost / index.php, все, кроме localhost / index (даже localhost / index.php), должно вернуть 404.
Думаю, мне придется добавить еще RewriteCond
для перехвата всего остального, кроме существующих файлов Request_Filename.php. Как мне получить 404 для всего остального, кроме localhost / index?
(Этот вопрос тоже касается SO с наградой, но я думаю, что serverfault может быть лучшим местом для этого.) Обновить Что делает .htaccess? Цель файлов htaccess - включить более чистые URL-адреса, такие как localhost / index вместо localhost / index.php, более подробное объяснение можно найти на источник этого кода
Учитывая изменение объема вопроса, я собираюсь ответить на него еще раз ...
Что делает .htaccess?
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME}.php -f
RewriteRule ^(.*)$ $1.php [L,QSA]
^(.*)$
) плюс ".php" - добавить строку запроса ([QSA]
) и прекратить обработку директив mod_rewrite после этого правила ([L]
).С этими правилами возникают некоторые серьезные проблемы - например, если вы создаете каталог с именем "index", пользователи, запрашивающие "domain.com/index", получат каталог, а не ваш файл index.php.
Учитывая ваше заявленное намерение:
Я хочу убедиться, что только localhost / index откроет localhost / index.php, все, кроме localhost / index (даже localhost / index.php), должно вернуть 404.
... Я бы рекомендовал следующую реализацию:
.htaccess
RewriteEngine On
RewriteCond %{REQUEST_URI} ^/index$
RewriteRule .* /index.php [L,QSA]
index.php
if ( $_SERVER['REQUEST_URI'] != '/index' ) {
header("Status: 404 Not Found");
require( '404.html' );
die();
}
Обновить:
Как я могу сделать то же самое, не имея скрипта на index.php?
Насколько мне известно, это невозможно сделать без вызова кладжа, потому что любое правило, которое применяется к /index.php, будет срабатывать, когда / index передается в /index.php
Вот неэлегантный кладж:
RewriteEngine On
RewriteCond %{REQUEST_URI} ^/index$
RewriteRule .* /index.php?rw=1 [L,QSA]
RewriteCond %{REQUEST_URI} ^/index\.php$
RewriteCond %{QUERY_STRING} !rw=1 [NC]
RewriteRule .* - [F]
(Теперь любой может получить доступ к "/index.php?rw=1" - это не так элегантно, как редактирование скрипта)