解决方案:

解决方案:

我有以下重写规则,可转换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以斜线开头,那么上面的仍然不正确吗?!)

相关内容