Ошибка .htaccess 404 на реальном пути - PullRequest
3 голосов
/ 18 ноября 2011

Я хочу следующее:

  1. www.bla-bla.com/ -> www.bla-bla.com/php/index.php
  2. www.bla-bla.com/php/index.php -> www.bla-bla.com/php/error.php

Я пробовал следующее, но не работает

RewriteEngine on
RewriteRule ^/?$  /php/index.php [S=1]
RewriteCond %{REQUEST_URI} =/php/index\.php
RewriteRule (.*)? /php/error.php [R=404]

Что я могу сделать, чтобы запретить доступ с реального пути?


URL=http://localhost
 (3) [perdir C:/xampp/htdocs/] strip per-dir prefix: C:/xampp/htdocs/ -> 
 (3) [perdir C:/xampp/htdocs/] applying pattern '/php/index\.php' to uri ''
 (3) [perdir C:/xampp/htdocs/] strip per-dir prefix: C:/xampp/htdocs/ -> 
 (3) [perdir C:/xampp/htdocs/] applying pattern '^(/?)$' to uri ''
 (2) [perdir C:/xampp/htdocs/] rewrite '' -> '/php/index.php'
 (1) [perdir C:/xampp/htdocs/] internal redirect with /php/index.php [INTERNAL REDIRECT]
 (3) [perdir C:/xampp/htdocs/] strip per-dir prefix: C:/xampp/htdocs/php/index.php -> php/index.php
 (3) [perdir C:/xampp/htdocs/] applying pattern '/php/index\.php' to uri 'php/index.php'
 (3) [perdir C:/xampp/htdocs/] strip per-dir prefix: C:/xampp/htdocs/php/index.php -> php/index.php
 (3) [perdir C:/xampp/htdocs/] applying pattern '^(/?)$' to uri 'php/index.php'
 (1) [perdir C:/xampp/htdocs/] pass through C:/xampp/htdocs/php/index.php
URL=http://localhost/php/index.php
 (3) [perdir C:/xampp/htdocs/] strip per-dir prefix: C:/xampp/htdocs/php/index.php -> php/index.php
 (3) [perdir C:/xampp/htdocs/] applying pattern '/php/index\.php' to uri 'php/index.php'
 (3) [perdir C:/xampp/htdocs/] strip per-dir prefix: C:/xampp/htdocs/php/index.php -> php/index.php
 (3) [perdir C:/xampp/htdocs/] applying pattern '^(/?)$' to uri 'php/index.php'
 (1) [perdir C:/xampp/htdocs/] pass through C:/xampp/htdocs/php/index.php

Опции + FollowSymlinks ПереписатьEngine на

RewriteRule /php/index\.php /php/error.php [L]
RewriteRule ^(/?)$ /php/index.php [QSA,L]

WTF здесь происходит?

Ответы [ 3 ]

1 голос
/ 18 ноября 2011

использовать

ErrorDocument 404 /php/error.php

в файле .htaccess

0 голосов
/ 18 ноября 2011

Джон: я не понимаю вашего решения.

Вот мое: сначала проверьте, есть ли попытка получить доступ к тому, что вам не нужно (например, /php/index.php), и если да, перенаправьте на ошибку иостановить всеЗатем после (только после ) вы уверены, что это не /php/index.php, поэтому примените перенаправление:

RewriteRule /php/index\.php /php/error.php [L]
RewriteRule / /php/index.php [QSA,L]

Имейте в виду, что [L]директива немедленно остановит RewriteRules, поэтому удалите оставшуюся последнюю, если вы хотите добавить другие RewriteRules.

Конечно, если вы хотите перенаправить ALL входящих запросов на php/index.php и передатьURL в качестве аргумента здесь является решением, которое должно работать (я говорю "должен", потому что я не проверял):

RewriteRule /php/index\.php /php/error.php [L]
RewriteRule (.*) /php/index.php?url=$1 [QSA,L]

Оливье

0 голосов
/ 18 ноября 2011

Попробуйте это:

# If the actual request is for /php/index.php, rewrite to error.php
RewriteCond %{THE_REQUEST} ^[A-Z]+\ /php/index.php  [NC]
RewriteRule ^php/index\.php /php/error.php  [L]

# Otherwise check if root request and rewrite to /php/index.php
RewriteRule ^$ /php/index.php  [L]

РЕДАКТИРОВАТЬ: отвечая на комментарии:

Без флага [L] он попытается применить следующее правило. mod_rewrite будет всегда отправлять его обратно через механизм переписывания после перезаписи URI. Это будет продолжаться до тех пор, пока URI не прошел двигатель без изменений. Первое условие проверяет, что фактический запрос предназначен для /php/index.php, так что переписанный URI не будет совпадать. Пример:

  1. Кто-то просит http://bla -bla.com /
  2. первое правило не совпадает, потому что HTTP-запрос GET / HTTP/1.1
  3. второе правило переписывается в /php/index.php
  4. mod_rewrite отправляет переписанный URI обратно через механизм перезаписи
  5. первое правило не соответствует, потому что даже если URI теперь "/php/index.php", исходный HTTP-запрос остается прежним : GET / HTTP/1.1
  6. второе правило не соответствует, потому что URI теперь "/php/index.php", а не "/".
  7. перезапись двигателя останавливается, потому что базовый URI не изменился.

Пример 2:

  1. Кто-то просит http://bla -bla.com / php / index.php
  2. первое правило соответствует, потому что HTTP-запрос GET /php/index.php HTTP/1.1
  3. URI переписывается на /php/error.php
  4. второе правило не соответствует
  5. URI отправляется обратно через механизм перезаписи
  6. условие первого правила соответствует, потому что HTTP-запрос все тот же
  7. однако, URI сейчас не '/php/index.php', поэтому фактическое правило не соответствует
  8. второе правило все еще не соответствует
  9. reiwrte двигатель останавливается, потому что базовый URI неизменен.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...