htaccess中的mod重写规则问题

时间:2019-04-10 10:09:20

标签: php apache .htaccess mod-rewrite

我正在寻找一个新网站,并想用url中的参数重写一些文件。

该站点目前尚未上线,很遗憾,我在mod_rewrite方面经验不足。

那我的问题是什么

我有两个文件:category.php和single.php

在我的索引上,我有一个菜单,该菜单通过url参数引用所有类别。 例如,在 sitename.com/index.php 上,您找到以下链接:

sitename.com/category.php?c=First
sitename.com/category.php?c=第二
sitename.com/category.php?c=第三
等等

例如,在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
等等

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

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>

每个RewriteRule都可以单独工作,但在一起我将无法获得预期的结果。

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

非常感谢

1 个答案:

答案 0 :(得分:0)

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

以下是修改后的版本,可用于指示正​​确的方向:

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状态500),则很可能是您运行了非常旧版本的apache http服务器。在这种情况下,您将在http服务器错误日志文件中看到对不支持的[END]标志的明确提示。您可以尝试升级,也可以使用较旧的[L]标志,在这种情况下,它的工作原理可能相同,尽管这取决于您的设置。

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

还有一个一般性说明:您应该始终喜欢将此类规则放置在http服务器主机配置中,而不要使用动态配置文件(“ .htaccess”)。这些动态配置文件增加了复杂性,通常是导致意外行为,难以调试的原因,并且确实降低了http服务器的速度。仅当您无法访问真正的http服务器主机配置(阅读:真正便宜的服务提供商)或坚持编写自己的规则的应用程序(这显然是安全的噩梦)时,才提供它们作为最后的选择。 / p>