htaccess 没有正确重写 URL

htaccess 没有正确重写 URL

这有点奇怪。我在服务器上做一些工作,我需要重写目录的规则,确实存在(在某些情况下,它们的深度超过一层)

目前我的.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]

相关内容