编辑:误解了这个问题。
您想将 /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]