htaccess中的RewriteRule错误

时间:2017-01-31 16:35:15

标签: php .htaccess

我遇到的问题如下:

RewriteRule ^site   site.php [NC,L]
RewriteRule ^site/([0-9a-zA-Z_-]+)$ site.php?parameter=1$ [NC,L]

这个想法是认识到如果url中有参数。 这就是我想要的:

www.example.com/site
www.example.com/site/1

据我所知,但我只是在尝试没有成功的事情。 提前谢谢。

2 个答案:

答案 0 :(得分:1)

在您的规则对中,第一个规则将匹配两个示例网址。因此,第二条规则永远将被应用。您必须更改规则的顺序:

RewriteEngine on
RewriteRule ^/?site/([0-9a-zA-Z_-]+)$ site.php?parameter=$1 [NC,L]
RewriteRule ^/?site/?$ site.php [NC,L]

请注意,我还略微修改了现在的第二条规则,以防止它匹配/sitelist之类的路径。此外,由于匹配/site.php,它也会阻止重定向循环...我添加的初始/?允许在http服务器主机配置中使用相同的规则而不进行修改,不仅在{{1}中样式动态配置文件。

一般提示:您应该始终更喜欢将此类规则放在http服务器主机配置中,而不是使用动态配置文件(" .htaccess")。这些文件非常容易出错,难以调试,它们确实会降低服务器的速度。它们仅作为最后一个选项提供给您无法控制主机配置的情况(阅读:非常便宜的托管服务提供商),或者您有一个依赖于编写自己的重写规则的应用程序(这是一个明显的安全噩梦) )。

答案 1 :(得分:1)

此行会将以site开头的所有网址重定向到site.php:

RewriteRule ^site   site.php [NC,L]

此行永远不会运行,因为site已被第一条规则捕获并重定向:

RewriteRule ^site/([0-9a-zA-Z_-]+)$ site.php?parameter=$1 [NC,L]

因此,首先运行第二条规则将解决问题,因为它会触发更具体的案例。