2011-06-20 62 views
0

我在使用htaccess重写平面链接时遇到了一些问题,我有两套独立完美运行的规则,但是如果放在一起会产生不良影响。.HTACCESS MOD_REWRITE FLAT链接问题

第一部分增加了一个尾随的正斜杠(如果缺失的话),并用301 divert重写URL。

第二个将所有'文件夹'转换为参数,然后以特定格式传递给php。

根据页面我们有一个未知数量的文件夹,所以希望保持代码的通用性。

问题是,尽管代码功能正常(即php提供了正确的参数),但url被重写为错误的格式。

PHP代码:

<?php echo ‘<pre>’;print_r($_GET); echo ‘</pre>’;?> 

示例网址:(除去HTTP://作为限制为每个问题两个连杆)

localhost/foo/bar 

重新写入

test.localhost/foo&other[]=bar/ 

带输出:

Array 
(
    [p] => foo 
    [other] => Array 
     (
      [0] => bar 
     ) 
) 

如果除去第一部分为htaccess的那么输出是相同的网址仍然是:​​

localhost/foo/bar 

的.htaccess:

Options +FollowSymlinks 
RewriteEngine on 

第1部分:

RewriteCond %{REQUEST_URI} !.*/$ 
RewriteRule (.*)$ /$1/ [L,R=301] 

SECTION 2:

RewriteRule ^(.*)/([^/]+)/?$ $1&other[]=$2 [L] 
RewriteRule ^(?!index\.php)([^/]+)/?$ /index.php?p=$1 [L,QSA] 
+0

我很困惑你想要做什么和问题是什么。请您澄清一下 - 请提供1或2个这样的URL示例:它们在浏览器中的外观以及如何将它们发送到PHP脚本(重写)。据我了解,你想'http:// example.com/foo/bar' =>'http:// example.com/foo/bar /'=> ???(将被发送到PHP的最终URL) – LazyOne

+0

我试图改变http:// localhost/foo/bar,所以如果需要的话附加一个正斜杠,当我print_r $ _GET时,我有一个数组Like( [p] => foo [other] => Array([0] => bar))。 localhost之后的第一部分成为p的值,其余部分放入另一个数组中。另外,原始文章中的条件/规则可以起作用,但是当它们一起使用时会出现问题。希望澄清 – 64k

回答

0

尝试这些行来代替:

Options +FollowSymlinks 
# Activate Rewrite Engine 
RewriteEngine on 
# Force trailing slash to be present (only if such file does not exist) 
RewriteCond %{REQUEST_FILENAME} !-f 
RewriteRule ^(.*[^/])$ /$1/ [R=301,QSA] 
# Rewrite rule to real php file (only if such folder does not exist) 
RewriteCond %{REQUEST_FILENAME} !-d 
RewriteRule ^([a-z0-9\-_]+)/([a-z0-9\-_]+)/$ /index.php?p=$1&other[]=$2 [NC,QSA,L] 

请注意,最后一行将只对这种结构的网址工作:/foo/bar/。它不会与/foo/bar(这不应该发生,因为我们有特殊的重定向规则添加尾部斜杠)以及与更长的URL,如/foo/bar/meow/ - 你需要复制和修改最后2行。

此外,如果存在与URL匹配的文件夹(例如foo/bar/),则规则将无法正常工作。

这些规则已经过测试并确认可以正常工作。让我知道你是否需要修改。