好的,我在.htaccess文件中重写规则!
我想要的方案是(使用网址http://doma.in/
作为示例):
index.html
子目录中是否存在/public
文件;如果确实如此,那就服务吧
index.php
要扩展我的示例,请说我们请求了网址http://doma.in/js/foobar.js
:
foobar.js
子目录中是否存在/public/js
文件;如果确实如此,那就服务吧
index.php?controller=js%2Ffoobar.js
这会涵盖静态文件,但我还需要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/
我会在我的应用程序中处理404s,好像文件不存在一样,它会重定向到index.php
确实存在 - 除非你有更好的解决方案,否则我对此感到满意:)
我真的希望这一切都有意义,因为我一直在寻找一整天这个场景的解决方案,这就是我所拥有的:
Options +FollowSymLinks
RewriteEngine on
RewriteBase /
#RewriteBase /prompt-v3/
#RewriteCond %{REQUEST_URI} ^/prompt-v3/(.*)$
RewriteCond $1 !^public
RewriteRule ^(.*)$ public/$1 [R]
注释掉的行在远程主机上处理子目录。到目前为止,我可以重定向到/public
子目录,如果该文件存在,那就是它。
谢谢大家的帮助!
答案 0 :(得分:1)
Options +FollowSymLinks
RewriteEngine on
RewriteBase /
#RewriteBase /sub-dir/
#RewriteCond %{REQUEST_URI} ^/sub-dir/(.*)$
RewriteRule ^index.html$ $1 [L,R=301]
RewriteCond $1 !^public
RewriteCond $1 !^lib
RewriteRule ^(.*)$ public/$1 [L]
RewriteCond $1 ^public/$
RewriteCond %{REQUEST_FILENAME}/index.html !-f
RewriteRule ^(.*)$ lib/bootstrap.php [L]
RewriteCond $1 !^public/$
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond $1 ^public/(.*)$
RewriteRule ^(.*)$ lib/bootstrap.php?path=%1 [L]
这将在公共目录中查找index.html文件,如果不存在,则将URL重写为lib / bootstrap.php。事实上,它首先在公共目录中检查任何请求作为静态文件,并处理规范化。
答案 1 :(得分:0)
将此.htaccess放入文档根目录
<ifModule mod_rewrite.c>
RewriteEngine on
# For /js/foobar.js (/js/*)
RewriteRule ^js/(.*)$ /public/js/$1 [NC]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^public/(.*)$ index.php?controller=$1 [NC,L]
# For foo/bar (/*/*?*)
RewriteRule ^(.*)/(.*)$ /public/$1/$2 [NC]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^public/(.*)/(.*)$ index.php?controller=$1&action=$2&querystring=%{QUERY_STRING} [NC,L]
</IfModule>