【问题标题】:Correct rewrite rule creating internal server error更正重写规则创建内部服务器错误
【发布时间】:2019-03-12 19:44:07
【问题描述】:

这是我最初的问题。 有些人正在做指向我网站的链接,但网址不正确,通常在网址后添加奇怪的字符。

所以,例如,而不是链接到: www.example.com/hello.php 他们链接到: www.example.com/hello.php+fiat 然后发生 404 错误。

我确实创建了一个像这样的重写规则,它就像一个魅力:

RewriteRule ^([a-z0-9\-/_]*\.php).* $1 [L]

我用相同的行为尝试了这 2 个(工作正常)

RewriteRule ^(.*\.php).* $1
RewriteRule ^(.*\.php).*$ $1

.php 之后的所有内容都被删除,然后指向正确的 url。 问号在重写中不是问题,这意味着我有很多带有 xyz.php?id= 的页面,我想保持它们原样。

但是现在,由于一个模糊的原因, 当我输入一个不存在的网址时: example.com/toto/index.php 我有一个 500 内部服务器错误,而不是通常的 404 页面。 但是如果我删除我的规则,那么我会像往常一样再次访问 404 页面。

如果它可以提供帮助,那么导致 Apache 崩溃的唯一规则就是:

RewriteRule ^(.*\.php).* $1 [R=301,L]

有什么想法吗? (在 Apache 2.2 上)

谢谢

【问题讨论】:

    标签: apache mod-rewrite


    【解决方案1】:
    RewriteRule ^(.*\.php).* $1 [R=301,L]
    

    很可能会创建无限循环,因为php 之后没有任何内容的任何 URL 都会匹配并重定向到自身,因为.php 之后的序列是可选的。

    你应该把最后的.*改成.+

    【讨论】:

    • 当然!非常感谢 !当我这样做时,它可以 100% 正常工作:RewriteRule ^(.*\.php).* $1 [L] 但如果我将 R=301 放入其中,RewriteRule ^(.*\.php).* $1 [R= 301,L] 然后它在域名和文件名之间添加我的服务器路径。
    • 我刚刚在 $1 之前添加了 /,如果设置了 R=301,则不会在域名和文件名之间添加我的服务器路径(但其他情况下工作正常)
    • 是的,默认情况下,目标假定为文件路径,而不是 URI。您也可以尝试使用[PT] 标志,请参阅httpd.apache.org/docs/2.4/rewrite/flags.html#flag_pt
    • 感谢您的额外回答:-)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-02-01
    • 1970-01-01
    • 2021-12-17
    • 1970-01-01
    • 2014-01-11
    • 1970-01-01
    相关资源
    最近更新 更多