.htaccess htaccess在没有公共模式的URL上重写

.htaccess htaccess在没有公共模式的URL上重写,.htaccess,rewrite,.htaccess,Rewrite,在一个新项目中,网站有一组静态html页面。所有者需要将它们转换为动态的。 每个页面都有:一个文本部分,一张小照片加上一些指向其他页面的链接,与此相关 所有这些我都可以放到数据库中并创建一个动态页面(php) 我的问题是每个静态页面都是唯一的——url中没有通用模式。目前有860页这样的页面。 我可以有一个url,如: folder1/folder2/item1.htm folder1/folder2/folder3/item2.htm folder1/folder2/folder2-fodle

在一个新项目中,网站有一组静态html页面。所有者需要将它们转换为动态的。 每个页面都有:一个文本部分,一张小照片加上一些指向其他页面的链接,与此相关

所有这些我都可以放到数据库中并创建一个动态页面(php)

我的问题是每个静态页面都是唯一的——url中没有通用模式。目前有860页这样的页面。 我可以有一个url,如:

folder1/folder2/item1.htm
folder1/folder2/folder3/item2.htm
folder1/folder2/folder2-fodler3/item3.htm
这3个是迄今为止最常见的模式(在860个URL中提供大约650个URL)

每个文件夹名称实际上是一个类别/子类别/关键字,我可以使用它来确定项目的属性。一般来说,前两个文件夹(folder1和folder2)是产品的类别和子类别,而下一个文件夹(文件夹3及其后)确定项目的部分(如果有)。 我希望这是有道理的

因此,一种想法是使用旧的、静态的url作为数据库字段,并将其匹配以提供内容,例如:

RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule (.*) /script.php?path=$1 [L]
我认为把这个规则放在我的重写规则的最后,可以确保所有其他重写都不受影响


这种做法可取吗?还是有别的办法?更坚固/安全/轻便的方法?

您描述的方法非常常见:

RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule (.*) /script.php?path=$1 [L]
您可以通过直接解析PHP脚本中的原始请求字符串来减轻它的负担,这更直接。查看您的服务器在
$\u服务器中提供的内容,例如运行
var\u转储($\u服务器)。您已经找到了与您正在使用的
$\u GET['path']
类似的内容,这通常更具可操作性:

RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule (.*) /script.php [L]
其次,根据apache服务器版本的不同,可以进一步简化为:

FallbackResource /script.php
这样,您就不用在当前使用的
RewriteCond
中进行额外的文件检查了。

只需使用

RewriteEngine on
RewriteBase /
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^/script.php?path=$1 [L]

根据您的描述,这些文件看起来很小,并且结构相对良好。更长期的解决方案可能是解析文件,将值存储在数据库中,并在动态页面中提供数据。这将使整个事情真正具有动态性,即内容和呈现方式很容易更改。(嗯,我刚刚看到这不是一个新问题。无论如何)重写规则没有目标(除非您想将URI重写为
[L]