我有以下重写规则,可转换example.com/anything/
为在以下位置加载页面example.com/anything.html
RewriteRule ^([A-Za-z0-9-]+)/?$ $1.html [L]
当物理目录或文件存在时,我需要对此规则进行例外处理。例如,如果存在物理目录,example.com/test/
则它应该从目录中加载索引/test/
,而不是将其重写为example.com/test.html
我相信我需要重写RewriteCond
类似于!-d
以下的条件!-f
:
https://httpd.apache.org/docs/2.4/rewrite/remapping.html#fallback-resource
我无法弄清楚如何写这些条件。
解决方案:
为条件添加前缀:
RewriteCond %{REQUEST_FILENAME} !-d
允许像平常一样读取目录。另外,我的正则表达式模式匹配不考虑带扩展名(缺少点.
)的文件名,因此诸如 的文件example.css
也将像平常一样被读取。
RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^([A-Za-z0-9-]+)/?$ $1.html [L]
答案1
是的,正如你所说,你需要额外的状况测试它不是目录。例如,在.htaccess
:
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^([A-Za-z0-9-]+)/?$ $1.html [L]
否定条件模式 !-d
检查是否REQUEST_FILENAME
未映射到目录。REQUEST_FILENAME
变量(在目录或.htaccess
上下文)保存请求映射到的文件/目录的绝对文件系统路径。
我认为你不需要检查文件,因为文件不应该匹配RewriteRule
图案 ^([A-Za-z0-9-]+)/?$
- 除非您有文件没有文件扩展名?
在里面Apache 文档你链接到:
RewriteCond "/var/www/my_blog/%{REQUEST_FILENAME}" !-d
考虑到示例显示它在目录上下文。(在服务器或者虚拟主机上下文,当与请求的 URL 路径REQUEST_FILENAME
相同时。但是,此变量随后将REQUEST_URI
以斜线开头,那么上面的仍然不正确吗?!)