我们已切换服务器,无论出于何种原因,我们的htaccess文件的行为方式与其他文件的行为方式不同。我将是第一个承认我不是超级用户的人,我毫不怀疑答案可能正在看着我,但实际上整个星期六的搜索都没有解决这个问题。我有这个文件系统:
当域 / category / subcategory / product /
时它应重写为 /category/product-details.php?p=product&s=subcategory
当域 / category / subcategory /
时它应重写为 /category-product-list.php?slug=subcategory
这看起来很简单,这是我们多年来一直使用的相同代码。注意,我们已经注释了关于斜杠的前两个RewriteRules,并且行为没有变化。
RewriteEngine On
RewriteBase /
# if folder does not end with a slash redirect to with slash
RewriteRule ^([-a-zA-Z0-9]+)$ /$1/ [L,NC,R=301]
#if it does not end with a slash e.g. rock-jewelry/some-piece, add the slash
RewriteRule ^([-a-zA-Z0-9]+/[-a-zA-Z0-9]+)$ /$1/ [L,NC,R=301]
RewriteRule ^category/([^/]+)/([^/]+)/?$ category/product-details.php?p=$2s=$1 [L,QSA]
RewriteRule ^category/([^/]+)/?$ category-product-list.php?slug=$1 [L,QSA]
当域 / category / subcategory / product /
时重写为 /category-product-list.php?slug=product-details.php&p=product&s=subcategory
当域 / category / subcategory /
时正确重写为 /category-product-list.php?slug=subcategory
/ category /是一个实际的文件夹,其中唯一的东西是product-details.php,没有index.php文件,如果他们试图将htaccess重写为category-product-list访问索引。
如果我们删除category-product-list.php规则,则product-details.php规则可以正常工作。但L指令不应该停留在第一条规则吗?为什么第二个还在运行?我怎样才能写出更好的方法来实现这一目标?非常感谢,我现在非常打击这个问题。
答案 0 :(得分:0)
我有同样的问题,你要理解这个循环的原因......但就像那样。
您可以在最后一次RewriteRule之前添加:
RewriteCond %{REQUEST_FILENAME} !-f
或者,如果您不在子类别中使用dot,则可以使用final RewriteRule:
RewriteRule ^category/([^./]+)/?$ category-product-list.php?slug=$1 [L,QSA]