关于SpeedPHP URL伪静态的问题

#1 52833

现在有一个问题,我是想将网站的一个二级目录(SpeedPHP 程序)通过.htaccess url重写的方式赋予一个二级域名
RewriteEngine onRewriteCond %{HTTP_HOST} ^dict.zp163.cn$
RewriteCond %{REQUEST_URI} !^/Dict/
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)$ /Dict/Index.php?$1
RewriteCond %{HTTP_HOST} ^dict.zp163.cn$
RewriteRule ^(/)?$ Dict/Index.php [L]



'map' => array( 'search'  => 'Search@Index')

测试地址 dict.zp163.cn/Search?q=good

通过修改spFunctions.php 文件 对echo $__controller."
". $__action; 等变量的输出      ch

可见 SpeedPHP  $__controller 接收到的值为dict.zp163.cn/Search?q=good 中的ch

上面的规则已经写明是将所有匹配到的信息发送至二级目录下的Index.php?$1




不知道算不算spUrlRewrite的一个小bug


还望jake耐心解答

2011-02-01 04:13:23

#2 52833

该问题解决了, 问题发生在spUrlRewrite.php的81行

$GLOBALS['G_SP']['url']['url_path_base']被自定义了,
在首页重新定义$spConfig['url']['url_path_base'] = 'Index.php';
即可解决


但现在又遇到一个伪静态规则的问题   
按照上面的规则 服务器会将所有的请求都解析到Index.php 包括已存在的文件

RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d

这两句貌似都不管用

2011-02-01 05:20:31

#3 jake

先看看这个 http://speedphp.com/post/interaction-htaccess.html

稍等我再来看看。

2011-02-01 07:54:52

#4 jake

主要的问题,是因为整个应用程序是放到二级目录中的(我测试的使用名称是rewrite)。所以无论是URL或是实际存在的文件(图片等),都需要在地址上面加入/rewrite/这样的二级目录。

1. 下面这两句是生效的,不过访问的时候要加上/rewrite/logo.gif这样
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d


2. UrlRewrite用下面的htaccess规则可以正常使用。
RewriteCond %{HTTP_HOST}  ^rewrite\.speedphp\.com$

   
RewriteCond %{REQUEST_FILENAME} !-f  

   
RewriteCond %{REQUEST_FILENAME} !-d   

   
RewriteCond %{REQUEST_URI} !^/rewrite/   
   
RewriteRule ^(.*)$ /rewrite/index.php  [L]

3. 用上面的规则,SP默认生成的地址,是/rewrite/search这样的地址。这也是因为程序在二级目录中。所以楼主说的,把url_path_base设置一下是很好的方法。感谢楼主的细心:handshake
整个UrlRewrite的设置是
$spConfig = array( 
        'launch' => array(
                  'router_prefilter' => array(
                          array('spUrlRewrite', 'setReWrite'),
                  ),
                 'function_url' => array(
                         array("spUrlRewrite", "getReWrite"),
                 ),
         ),
        'url' => array(
                  'url_path_base' => '/index.php',
         ),
         'ext' => array(
                 'spUrlRewrite' => array(
                         'suffix' => '',
                         'sep' => '-',
                         'map' => array(
                                         'search' => 'search@index'
                         ),
                 ),
         ),
);
这样生成的地址就是/search了,而且也可以正常使用。

2011-02-01 10:08:59

#5 52833

感谢jake耗时达2小时的耐心解答
不过还有些小小的问题:
1. 下面这两句是生效的,不过访问的时候要加上/rewrite/logo.gif这样
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d


在 rewrite的规则 中 有没有办法将上面的二级目录给重写掉呢?

直接rewrite.speedphp.com/logo.gif 就可以访问的到呢?

2011-02-01 11:31:16

#6 jake

这个也得写规则,我先去试试。

2011-02-01 11:53:32

#7 52833

感谢jake  我是用了两个.htaccess文件完成的

根目录下
RewriteCond %{HTTP_HOST}  ^rewrite\.speedphp\.com$
RewriteCond %{REQUEST_FILENAME} !-f  
RewriteCond %{REQUEST_FILENAME} !-d   
RewriteCond %{REQUEST_URI} !^/rewrite/      
RewriteRule ^(.*)$ /rewrite/index.php  [L]
rewrite目录下

RewriteEngine On
RewriteBase /Dict
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)$ Index.php?$1 [L]
问题虽然解决了,但是总觉得会给服务器增加不少负担。期待jake更好的方法。

2011-02-01 12:01:20

#8 jake

不错的方法。:handshake

2011-02-01 12:38:25