Назад | Перейти на главную страницу

Ссылка Duplicity и mod_rewrite

Я использую 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]
  1. Соответствует, если запрошенный URI не является допустимым файлом.
  2. Соответствует, если запрошенный URI не является допустимым каталогом.
  3. Соответствует, если запрошенный URI плюс "любой одиночный символ" плюс "php" является действительный файл PHP (обратите внимание, что он будет соответствовать "index-php" так же, как и "index.php" - вы должны экранировать символ точки, если хотите буквальное совпадение).
  4. Передайте запрос "какой бы ни была строка запроса" (^(.*)$) плюс ".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" - это не так элегантно, как редактирование скрипта)