问题描述
我正在尝试进行重写,如果页面不存在,它会重写为类别页面。它与普通的 RewriteCond %{REQUEST_FILENAME} -f 有点不同,因为页面名称是基于 URL 动态的。
如果有人访问动态路径名,例如“/contacts”
/[dynamicpath]/[dynamicpath].PHP
示例:
/contacts/contacts.PHP
如果不存在,重写到下一页
/categories/category/category.PHP?cat_url=[dynamicpath]
示例:
/categories/category/category.PHP?cat_url=contacts
我已经尝试了下面的方法,但是当文件存在并直接进入类别重写时,它会因第一个 RewriteRule 触发而失败。
RewriteCond %{SCRIPT_URL} ^(.+)
RewriteCond %{DOCUMENT_ROOT}/%1/%1.PHP !-f
RewriteRule (.+)/?$ $1/$1.PHP [QSA,L]
RewriteRule ^([\w-]+)/?$ /categories/category/category.PHP?cat_url=$1 [QSA,L]
解决方法
您可以在站点根目录 .htaccess 中使用这些规则:
RewriteEngine On
# attempt rewrite to /[dynamicpath]/[dynamicpath].php
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{DOCUMENT_ROOT}/$1/$1.php -f
RewriteRule ^(.+?)/?$ $1/$1.php [L]
# else rewrite to categories/category/category.php?cat_url=...
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.+?)/?$ categories/category/category.php?cat_url=$1 [QSA,L]
,
我通过检查传递的服务器变量找到了答案,发现 %{REQUEST_FILENAME} 包含完整的文件路径(document_root+filename)。
RewriteCond %{DOCUMENT_ROOT}%{REQUEST_URI}%{REQUEST_URI}.php -f
RewriteRule ^(.+)/?$ $1/$1.php [L]
RewriteRule ^(.+)/?$ categories/category/category.php?cat_url=%{REQUEST_URI} [QSA,L]