Htaccess 重写动态文件名和重写路径

问题描述

我正在尝试进行重写,如果页面不存在,它会重写为类别页面。它与普通的 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]