男人......我不知所措。我有一个基本的重写流程,我似乎无法工作。我想检查是否存在真实文件。如果是,请服务它,但如果没有,请重新路由到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
以下是许可 我将不胜感激任何帮助。 感谢。
答案 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
:
/test.html
/application/test.html
。重写进入下一次迭代([L]
标志)。/application/test.html
,并且此类文件确实存在。这条规则告诉Apache停止重写任务 - 完成工作。这适用于/meow.html
:
/meow.html
/application/meow.html
。core/index.php?f=%{DOCUMENT_ROOT}/application/meow.html
。重写进入下一次迭代([L]
标志)。/core/index.php
,并且此类文件确实存在。这条规则告诉Apache停止重写任务 - 完成工作。 修改强>
您可以在RewriteRule的目标部分之前添加前导斜杠/
(应该没有区别......但您的设置可能与我的设置略有不同)。