URL重写检查静态文件然后重写为index.php

时间:2012-07-19 23:39:51

标签: .htaccess mod-rewrite redirect

好的,我在.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/barhttp://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子目录,如果该文件存在,那就是它。

谢谢大家的帮助!

2 个答案:

答案 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>