Правила htaccess неправильно маршрутизируются на сервере (проверка реальных файлов) - PullRequest
1 голос
/ 11 июля 2011

Человек .. Я в растерянности.У меня есть основной поток переписывания, который я не могу заставить работать.Я хочу проверить, существует ли настоящий файл.Если это так, подайте его, но если нет, перенаправьте его в файл PHP.Вот мой файл .htaccess:

RewriteEngine On
RewriteCond %{DOCUMENT_ROOT}/application%{REQUEST_URI} !-f
RewriteRule ^(.*)$ core/index.php?f=%{DOCUMENT_ROOT}/application%{REQUEST_URI} [QSA,L]

RewriteRule (.*) application/$1 [L]

Моя структура каталогов следующая:

.
├── [drwxr-xr-x]  application
│   └── [-rw-r--r--]  test.html
├── [drwxr-xr-x]  core
│   ├── [-rw-r--r--]  index.php
│   └── [drwxr-xr-x]  tmp
│       ├── [-rw-r--r--]  httpd-access.log
│       ├── [-rw-r--r--]  httpd-error.log
│       └── [-rw-r--r--]  rewrite.log
└── [-rw-r--r--]  .htaccess

3 directories, 6 files

Вот разрешение, я был бы признателен за любую помощь.Спасибо.

Ответы [ 3 ]

0 голосов
/ 11 июля 2011

Возможно, вы сможете добавить директиву RewriteBase / или RewriteBase% {DOCUMENT_ROOT} сразу после RewriteEngine On

0 голосов
/ 11 июля 2011

Для размещения в .htaccess в корневой папке. Если вы собираетесь поместить его в конфигурационный файл (например, внутри <VirtualHost>), его нужно немного изменить.

RewriteEngine On
RewriteBase /

# 1) do not do anything for existing file or folder
RewriteCond %{ENV:REDIRECT_STATUS} !^$
RewriteCond %{REQUEST_FILENAME} -f [OR]
RewriteCond %{REQUEST_FILENAME} -d
RewriteRule .* - [L]

# 2) real file (in application folder) -- rewrite path
RewriteCond %{DOCUMENT_ROOT}/application%{REQUEST_URI} -f
RewriteRule (.*) /application/$1 [L]
# 3) nope, no such file -- serve via index.php
RewriteRule ^(.*)$ /core/index.php?f=%{DOCUMENT_ROOT}/application%{REQUEST_URI} [QSA,L]

Важным моментом, о котором многие забывают, является тот факт, что после перезаписи URL он переходит к следующей итерации. И на такой следующей итерации URL уже отличается от первоначально запрошенного. Эти правила должны позаботиться об этом моменте.

Вот как это будет работать для /test.html:

  1. Правило № 1 будет пропущено, так как его нет /test.html
  2. Правило # 2 будет работать, так как существует файл /application/test.html. Перезапись переходит к следующей итерации (флаг [L]).
  3. Правило # 1 будет работать, так как URL теперь равен /application/test.html, и такой файл существует. Это правило предписывает Apache прекратить переписывать дальше - работа выполнена.

Вот как это будет работать для /meow.html:

  1. Правило # 1 будет пропущено, так как его нет /meow.html
  2. Правило # 2 будет пропущено, так как нет файла /application/meow.html.
  3. Правило № 3 будет работать - URL переписан на core/index.php?f=%{DOCUMENT_ROOT}/application/meow.html. Перезапись переходит к следующей итерации (флаг [L]).
  4. Правило # 1 будет работать, так как URL сейчас /core/index.php, и такой файл существует. Это правило предписывает Apache прекратить переписывать дальше - работа выполнена.

EDIT: Вы можете добавить начальную косую черту / перед целевой частью RewriteRule (не должно быть никакой разницы ... но ваша установка может немного отличаться от моей).

0 голосов
/ 11 июля 2011

Вы уверены, что в вашем Apache включена перезапись модов?

...