此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重写方法有什么问题吗?我仍然无法解决问题。
答案 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?$
表示前一个匹配是可选的,但我删除了它,因为如果没有,则捕获组是可选的。所以我不确定你有什么目的。因为在我阅读时,这意味着t
,File.ReadLines(path, Encoding.UTF8)
.AsParallel().WithDegreeOfParallelism(10)
.ForAll(doSomething);
是可选的......