0

我的应用程序的网址是这样的:http://domain.com/projects/project-name/

我的应用程序的文件系统是这样的:

htdocs/projects/project-name/
 L index.html
 L img/image1.png
 L img/image2.png
 L img/...

我需要发送http://domain.com/projects/project-name/ 请求

htdocs/index.php?section=$1&item=$2

但它们显示的是 project-name/index.html 文件。

这是我尝试过的:

RewriteEngine on
RewriteCond %{REQUEST_FILENAME} -f
RewriteRule . - [L]
RewriteRule ^([^/]+)/([^/]+)/?$ index.php?section=$1&item=$2&%{QUERY_STRING} [NC,L]

显然,RewriteCond %{REQUEST_FILENAME} -f规则是罪魁祸首。但我需要让服务器提供静态 img 文件。如何告诉它允许所有文件请求但重写项目文件夹的默认 index.html?

4

2 回答 2

0

编辑:误解了这个问题。

您想将 /projects/project-name/ 重写为 index.php?...我还假设您希望能够从 project-name 中请求文件:

RewriteEngine on
RewriteRule ^([^/]+)/([^/]+)(/(index[^/]+)?)?$ /index.php?section=$1&item=$2 [QSA,NC,L]

如果能够从项目名称子目录请求文件并不重要,只需将其删除(/(index[^/]+)?)并替换为/. (/(index[^/]+)?)假设您的文件DirectoryIndex以“索引”开头。

嗯。

考虑启用 mod_rewrite 日志来分析它如何应用您的条件和模式。在服务器或虚拟主机范围内(不是 htaccess)添加:

LogLevel warn rewrite:trace6

LogLevel指令可以启用 mod_rewrite 的日志记录,它将被写入您定义的ErrorLog. trace6 是进入十六进制输出之前的最高 mod_rewrite 日志级别。完成后请务必注释掉或删除 LogLevel。


原始的,不相关的答案(忽略):

你需要否定文件,现在你不是,注意使用!

RewriteCond %{REQUEST_FILENAME} !-f

最重要的是,您的RewriteCond不会影响您的第二个 RewriteRule。它仅适用于第一个 RewriteRule (在您的情况下RewriteRule . - [L]):

RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule . - [L]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^([^/]+)/([^/]+)/?$ index.php?section=$1&item=$2&%{QUERY_STRING} [NC,L]

你也可以选择否定目录:

RewriteCond %{REQUEST_FILENAME} !-d

我还考虑使用QSA(查询字符串附加)标志而不是附加QUERY_STRING

RewriteRule ^([^/]+)/([^/]+)/?$ index.php?section=$1&item=$2 [QSA,NC,L]

总之:

RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . - [L]

RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^([^/]+)/([^/]+)/?$ index.php?section=$1&item=$2 [QSA,NC,L]
于 2013-09-23T21:14:39.430 回答
0

它应该可以工作,我提供了一个稍微修改过的规则版本,完整.htaccess的放置在DOCUMENT_ROOT/.htaccess

DirectoryIndex index.php index.html

Options +FollowSymLinks -MultiViews
# Turn mod_rewrite on
RewriteEngine On

RewriteCond %{REQUEST_FILENAME} -f
RewriteRule ^ - [L]

RewriteRule ^([^/]+)/([^/]+)/?$ /index.php?section=$1&item=$2 [L,QSA]
于 2013-09-23T21:33:17.080 回答