在将查询字符串行添加到其中后,URL重写无法正常工作

时间:2018-03-11 06:42:48

标签: php .htaccess url-rewriting

此URL重写行可以正常直到查询字符串行,并且在查询字符串之后,其中任何一行都不起作用。

ReWriteEngine On
ReWriteRule ^home?$ /mysite/index.php
ReWriteRule ^gallery?$ /mysite/gallery.php
ReWriteRule ^([a-z0-9]+)?$ /mysite/owner.php?name=$1
ReWriteRule ^about?$ /mysite/about.php
ReWriteRule ^location?$ /mysite/location.php

前两行 home gallery 按预期工作(包括第三行查询字符串),但其他两行关于和位置不能工作。 如果我要求这两页重写名称页面不会出现在浏览器中(响应什么都没有,除了我和我目前正在使用同一页面 - 甚至没有收到404错误消息),但是如果我要求那些带有.php扩展名的原始名称的页面进入浏览器。我尝试将这两个 about和location 放在查询字符串行的顶部,然后这两个页面按预期正常工作,但是当它们低于查询字符串行时然后只有他们不工作。 我可以知道URL重写方法有什么问题吗?我仍然无法解决问题。

2 个答案:

答案 0 :(得分:1)

您的尝试存在许多问题,以下是稍加修改的版本:

ReWriteEngine On
ReWriteRule ^/?home/?$ /mysite/index.php [END]
ReWriteRule ^/?gallery/?$ /mysite/gallery.php [END]
ReWriteRule ^/?about/?$ /mysite/about.php [END]
ReWriteRule ^/?location/?$ /mysite/location.php [END]
ReWriteRule ^([a-z0-9]+)/?$ /mysite/owner.php?name=$1 [END]

规则的顺序很重要。更通用的应该放在下面更专业的那些。

如果您遇到上述设置的http状态500(服务器内部错误),则可能是您运行的是非常旧版本的apache http服务器。在这种情况下,将[END]标志替换为[L]标志,该标志在这种情况下也应该可以正常工作。

以上规则同样适用于真实的http服务器主机配置和动态配置文件。

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

答案 1 :(得分:1)

我会改变这些

的顺序
ReWriteRule ^([a-z0-9]+)?$ /mysite/owner.php?name=$1
ReWriteRule ^about?$ /mysite/about.php
ReWriteRule ^location?$ /mysite/location.php

ReWriteRule ^about$ /mysite/about.php [L]
ReWriteRule ^location$ /mysite/location.php [L]
ReWriteRule ^([a-z0-9]+)$ /mysite/owner.php?name=$1 [L]

并添加最后一个标志。

会发生的事情是^([a-z0-9]+)?更通用,并且在达到最后2条规则之前匹配并更改网址。

换句话说,如果您的网址与about匹配,那么此^([a-z0-9]+)?会更改,然后与其实际规则不匹配。因此,通过将更通用的规则放在最后,您可以避免这种情况。

正如我在评论中所说,我会在[L]Last中添加 ReWriteRule ^(about|location)$ /mysite/$1.php [L] 标志,以便在匹配完成后结束重写,否则您可以获得意外匹配。

你也可以结合其中一些(可能)

?

我很确定^about?$表示前一个匹配是可选的,但我删除了它,因为如果没有,则捕获组是可选的。所以我不确定你有什么目的。因为在我阅读时,这意味着tFile.ReadLines(path, Encoding.UTF8) .AsParallel().WithDegreeOfParallelism(10) .ForAll(doSomething); 是可选的......