[英]URL rewriting doesn't work right after adding a query string line into it
此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重写方法有什么问题吗? 我仍然无法解决问题。
您的尝试有很多问题,这是一个稍作修改的版本:
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服务器的版本非常旧。 在那种情况下,用[L]
标志替换[END]
标志,在这种情况下也应该可以正常工作。
以上规则在实际的http服务器主机配置和动态配置文件中同样起作用。
还有一个一般性提示:您应该始终喜欢将此类规则放置在http服务器(虚拟)主机配置中,而不是使用动态配置文件( .htaccess
样式文件)。 众所周知,这些文件容易出错,难以调试,并且确实降低了服务器的速度。 仅当您无法控制主机配置(阅读:真正便宜的托管服务提供商)或者您的应用程序依赖于编写自己的重写规则(这显然是安全噩梦)时,才将它们作为最后一个选项来支持。 )。
我会改变这些顺序
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条规则之前匹配并更改URL。
换句话说,如果您的URL与其相关about
则匹配此^([a-z0-9]+)?
被更改,然后与实际规则不匹配。 因此,通过将更通用的规则放在最后,您可以避免这种情况。
就像我在评论中所说的,我会在[L]
Last
[L]
或[ Last
[L]
添加[L]
标志,这样一旦完成匹配,它将结束重写,否则您将获得意外的匹配。
您也可以结合其中一些(可能)
ReWriteRule ^(about|location)$ /mysite/$1.php [L]
我很确定?
表示前面的匹配是可选的,但是我删除了它,因为如果没有,则捕获组是可选的。 所以我不确定您在那里拥有它的目的是什么。 因为在我阅读时,这意味着^about?$
,而t
是可选的...
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.