htaccess规则在服务器上没有正确路由(真实文件检查)

时间:2011-07-10 22:00:36

标签: php apache .htaccess routing

男人......我不知所措。我有一个基本的重写流程,我似乎无法工作。我想检查是否存在真实文件。如果是,请服务它,但如果没有,请重新路由到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 :(得分:0)

你确定你的Apache已经开启了mod重写吗?

答案 1 :(得分:0)

也许您可以在 RewriteEngine On

之后立即添加 RewriteBase / RewriteBase%{DOCUMENT_ROOT} 指令

答案 2 :(得分:0)

置于根文件夹中的 .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停止重写任务 - 完成工作。
  4. 这适用于/meow.html

    1. 将跳过规则#1,因为没有/meow.html
    2. 将跳过规则#2,因为没有文件/application/meow.html
    3. 规则#3将有效 - 网址已重写为core/index.php?f=%{DOCUMENT_ROOT}/application/meow.html。重写进入下一次迭代([L]标志)。
    4. 规则#1将起作用,因为URL现在是/core/index.php,并且此类文件确实存在。这条规则告诉Apache停止重写任务 - 完成工作。
    5. 修改 您可以在RewriteRule的目标部分之前添加前导斜杠/(应该没有区别......但您的设置可能与我的设置略有不同)。