htaccess 中的 mod 重写规则存在问题



我正在建立一个新网站,想重写一些带有 urls 参数的文件。

该网站现在还没有上线,不幸的是,我在mod_rewrite方面没有很多经验。

那么我的问题是什么:

我有两个文件:类别.php和单个.php

在我的索引上,我有一个菜单,通过 URL 参数引用所有类别。 例如,在sitename.com/index.php上,您可以找到指向:

sitename.com/category.php?c=First sitename.com/category.php?c=Second

sitename.com/category.php?c=Third
等的链接

例如,在 sitename.com/category.php?c=First 上,您可以找到所有帖子的列表,这些帖子首先引用类别并链接到:

sitename.com/single.php?c=Frist&name=name1
sitename.com/single.php?c=Frist&name=name2 sitename.com/single.php?c=Second&name=name3

sitename.com/single.php?c=Third&name=name4
等等

现在我尝试将 url 重新设置为以下结构:

sitename.com/category.php?c=First => sitename.com/First
sitename.com/category.php?c=Second=> sitename.com/Second
sitename.com/single.php?c=Frist&name=name2 =>sitename.com/First/name2
sitename.com/single.php?c=Second&name=name3 =>sitename.com/Second/name3

我使用了以下代码

<IfModule mod_rewrite.c>
RewriteEngine On
RewriteBase /
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)$ categroy.php?c=$1 [L,QSA]
RewriteRule ^(.*)/(.*)$ single.php?c=$1&name=$2 [L,QSA]
</IfModule>

每个重写规则都为自己工作,但在一起我不会得到预期的结果。

所以我现在尝试了几天,但我不明白。
所以希望这里有人可以提供帮助

多谢

您的尝试存在几个问题,但重点是您需要注意规则的顺序。由于规则是从上到下应用的,因此您需要在文件中放置更专业的规则(因此再往上),稍后再放置更通用的规则......

这是一个修改后的版本,为您指明正确的方向:

RewriteEngine On
RewriteBase /
RewriteCond %{REQUEST_FILENAME} -f [OR]
RewriteCond %{REQUEST_FILENAME} -d
RewriteRule ^ - [END]
RewriteRule ^/?(w+)/(w+)/?$ single.php?c=$1&name=$2 [END,QSA]
RewriteRule ^/?(w+)/?$ category.php?c=$1 [END,QSA]

如果您使用上述规则收到内部服务器错误(http status 500),那么您很可能操作的是 apache http 服务器的旧版本。在这种情况下,您将在 http 服务器错误日志文件中看到不受支持的[END]标志的明确提示。您可以尝试升级或使用较旧的[L]标志,在这种情况下它可能具有相同的工作原理,尽管这在一定程度上取决于您的设置。

这些规则同样适用于 http 服务器主机配置或动态配置文件(".htaccess"文件)。显然,重写模块需要加载到 http 服务器内部并在 http 主机中启用。如果您使用动态配置文件,则需要注意在主机配置中完全启用其解释,并且它位于主机的DOCUMENT_ROOT文件夹中。

一般评论:您应该始终倾向于将此类规则放在 http 服务器主机配置中,而不是使用动态配置文件(".htaccess")。这些动态配置文件增加了复杂性,通常是意外行为的原因,难以调试,并且它们确实会减慢 http 服务器的速度。它们仅作为最后选项提供,用于您无法访问真正的http服务器主机配置(阅读:非常便宜的服务提供商)或坚持编写自己的规则的应用程序(这是一个明显的安全噩梦)。

最新更新