1

好的,我对 .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/barhttp://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如果文件存在,我可以重定向到子目录,仅此而已。

谢谢你们每一个人的帮助!

4

2 回答 2

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。实际上,它首先将任何请求作为公共目录中的静态文件进行检查,并且也处理规范化。

于 2012-08-01T13:30:13.443 回答
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>
于 2012-07-20T06:39:08.167 回答