好的,我对 .htaccess 文件中的重写规则感到厌烦!
我想要的场景是(以 URLhttp://doma.in/
为例):
- 首先检查子目录中是否
index.html
存在文件;/public
如果是的话,服务它- 如果没有;服务(重写)
index.php
- 如果没有;服务(重写)
为了扩展我的示例,假设我们请求了 URL http://doma.in/js/foobar.js
:
- 首先检查子目录中是否
foobar.js
存在文件;/public/js
如果是的话,服务它- 如果没有;服务(重写)
index.php?controller=js%2Ffoobar.js
- 如果没有;服务(重写)
这将涵盖静态文件,但我还需要以下 URL http://doma.in/foo
:
- 首先检查子目录中是否
foo
存在文件;/public
如果是的话,服务它- 如果没有;服务(重写)
index.php?controller=foo
- 如果没有;服务(重写)
和一个网址http://doma.in/foo/bar
:
- 我们可以假设该文件
foo/bar
不存在于/public
子目录中,因为文件不能这样命名。- 所以服务(重写)
index.php?controller=foo&action=bar
- 所以服务(重写)
我确定如果这个复杂的(对我来说)位被涵盖,那么我也可以在这个场合使用查询字符串;所以http://doma.in/foo/bar/foo/bar
会服务index.php?controller=foo&action=bar&querystring=foo%2Fbar
。
我还想确保尾部斜杠的处理方式与省略尾部斜杠相同,例如:http://doma.in/foo/bar/foo/bar
和http://doma.in/foo/bar/foo/bar/
我将在我的应用程序中处理 404,就好像该文件不存在一样,它会重定向到index.php
确实存在的文件 - 除非您有更好的解决方案,否则我对此很满意 :)
我真的希望这一切都有意义,因为我整天都在寻找解决这种情况的方法,这就是我所拥有的:
Options +FollowSymLinks
RewriteEngine on
RewriteBase /
#RewriteBase /prompt-v3/
#RewriteCond %{REQUEST_URI} ^/prompt-v3/(.*)$
RewriteCond $1 !^public
RewriteRule ^(.*)$ public/$1 [R]
注释掉的行在远程主机上处理子目录。到目前为止,/public
如果文件存在,我可以重定向到子目录,仅此而已。
谢谢你们每一个人的帮助!