.HTACCESS MOD_REWRITE FLAT链接问题

时间:2011-06-20 16:16:36

标签: regex apache .htaccess mod-rewrite

我在使用htaccess重写平面链接时遇到了一些问题,我有两套规则可以独立完美地工作但是当放在一起会产生不良影响。

如果一个缺席,则第一部分添加一个尾随正斜杠,并用301转移重写该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] 

第2节:

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

1 个答案:

答案 0 :(得分: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(这应该永远不会发生,因为我们有特殊的重定向规则来添加尾部斜杠)以及更长的网址,例如/foo/bar/meow/ - 您需要复制和修改最后2行

此外,如果有一个与网址匹配的文件夹(例如foo/bar/),则规则也不会有效。

这些规则经过测试并确认可行。如果您需要任何修改,请告诉我。