这有点奇怪。我在服务器上做一些工作,我需要重写目录的规则,确实存在(在某些情况下,它们的深度超过一层)
目前我的.htaccess 如下所示:
RewriteEngine on
RewriteRule ^simfiles/([-\ a-zA-Z0-9:/]+)$ http://mydomain.com/?portal=simfiles&folder=$1 [L]
这是可以正常工作的,例如如下的 URL:
mydomain.com/sifmiles/my-files
将被重定向至
mydomain.com/?portal=simfiles&folder=my-files
或者,对于深度超过一级的目录结构:
mydomain.com/sifmiles/my-files/more-of-my-files
将被重定向至
mydomain.com/?portal=simfiles&folder=my-files/more-of-my-files
我编写了正则表达式,以便它不会匹配路径中带有 . 的内容,因为 simfiles/somedirectory 中有 css 和 js 文件,如果我重定向所有内容,则无法加载这些文件。
我尝试了这样的配置:
RewriteEngine on
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^simfiles/([-\ a-zA-Z0-9:/\.]+)$ http://mydomain.com/?portal=simfiles&folder=$1 [L]
但这不起作用,仍然无法正确加载。
所以我的第一个问题是,我如何才能“正确”地实现这一点?我不喜欢我的解决方案,因为这意味着如果文件夹名称中包含 . ,则不会发生重定向。
我的第二个问题是,虽然重定向正确进行,但 URL 变成:
http://mydomain.com/?portal=simfiles&folder=my-files
我希望 URL 保持干净,例如:
http://mydomain.com/sifmiles/my-files
我怎样才能实现这个目标?
答案1
您对正则表达式想得太多了。由于您已经在重写规则之前检查了底层文件是否存在,因此您应该能够匹配任何内容。
RewriteRule ^simfiles/(.+) /?portal=simfiles&folder=$1 [L,QSA]