我在使用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]
答案 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/
),则规则也不会有效。
这些规则经过测试并确认可行。如果您需要任何修改,请告诉我。