在我的网站上,我有3种网址,如下所示,
index.php?p=my-page
index.php?p=my-page&id=12
index.php?p=my-page&id=12&type=d所以,我需要把他们
example.com/my-page
example.com/my-page/12
example.com/my-page/12/d我就是这样在我的.htaccess文件中尝试的。
<IfModule mod_rewrite.c>
# (1)
RewriteEngine On
# (2)
Options +FollowSymlinks
Options -MultiViews
# (3)
# Options +SymLinksIfOwnerMatch
# (4)
RewriteBase /
# (5)
# RewriteOptions <options>
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^([^/]+)/?$ index.php?p=$1 [L,QSA,NC,B]
# RewriteRule ^([^/]+)/([^/]+)/?$ index.php?p=$1&id=$2 [L,QSA,NC,B]
# RewriteRule ^([^/]+)/([0-9]+)/?$ index.php?p=$1&id=$2 [L,QSA,NC]
</IfModule>上面的第一个RewriteRule为example.com/my-page工作。但是第二或第三个并不适用于我的其他两个urls。
我的<a>标记如下所示:
<a href="/my-page">Page</a> // this is working for me using above first rule
<a href="/my-page/12/">Page</a>
<a href="/my-page/12/d">Page</a>有人能告诉我,为何我的规则2或3在这方面不起作用?
发布于 2022-06-08 04:41:44
在规则上使用标志,所以一旦规则匹配,Apache就会在替换时重新启动对匹配的检查。您还缺少了标志,所以替换不仅仅是index.php?...,因为PATH_INFO是附加的。人们通常想要的不是L,而是END。
您还可以将它们压缩为单个规则,这样您就不必对每个规则重复RewriteCond指令:
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^([^/]++)(?:/([1-9]\d*+)(?:/([^/]++))?+)?+/?+$ index.php?p=$1&id=$2&type=$3 [END,QSA,NC,B]请参阅正则解释的单元测试部分。
在PHP中,确保参数不是空字符串,例如:
$id = $_GET['id'] ?? '';
if ($id !== '') {
...
}https://stackoverflow.com/questions/72442472
复制相似问题