【问题标题】:Apache - Rewriting trailing extension with .htaccessApache - 使用 .htaccess 重写尾随扩展
【发布时间】:2018-03-09 15:01:48
【问题描述】:

要删除尾随扩展名(在这种情况下为.php),我尝试了以下两组规则

RewriteCond %{THE_REQUEST} (\S*?)/(.*?)\.php [NC]
RewriteRule ^ %1/%2 [L,R=301]
RewriteCond %{REQUEST_URI} ^(.*)$
RewriteRule !\.php$ %1.php [NC,L]

RewriteRule ^(.*?)\.php$ $1 [NC,L,R=301]
RewriteCond %{REQUEST_URI} ^(.*)$
RewriteRule !\.php$ %1.php [NC,L]

要将像test.com/test.php 这样的网址转换为test.com/test,第一个有效,而第二个最终无限循环。 rewrite_log 只是令人困惑,所以谁能告诉第二组有什么问题?

PS:对于像test.com 这样的情况,这些规则可能效率低下甚至不够用,但这不是问题所在。我只是想了解重写是如何工作的 BTS。

【问题讨论】:

  • 您的第一条规则有效,因为您使用的是%{THE_REQUEST} 变量。您的第二条规则RewriteRule ^(.*?)\.php$ $1 [NC,L,R= 301] 无条件地将file.php 重定向到/file,所以这个循环。
  • 您可以在第二条规则中使用END 标志来避免循环错误RewriteRule !\.php$ % 1.php [END]
  • @starkeen ...如果这是在.htaccess 文件中(如标签所暗示的那样),那么[END][L] 基本上不是同义词吗?
  • @starkeen 一旦file.php成为文件,重写规则不应该不满足条件而跳过它吗?
  • @AnuragDaolagajao: mod_rewrite 规则循环运行,直到一个或多个规则匹配条件或模式。 L 标志仅在循环中作为 continue 工作,但 END(适用于 Apache 2.4+)作为 break 工作并停止循环。使用%{THE_REQUEST} 不会导致循环,因为%{THE_REQUEST} 不会随着其他规则的应用而改变,而REQUEST_URI 在每次规则执行后都会更新。

标签: php apache .htaccess mod-rewrite url-rewriting


【解决方案1】:

如 cmets 中所述,在第一种情况下,没有使用 %{THE_REQUEST} 的循环,因为该值是静态的,并且即使在重定向/“循环”之后,一旦服务器接收到它就不会改变。因此,该规则将删除尾随 .php 并重定向。由于重写规则是在rewritecond 中替换来自%{THE_REQUEST} 的值,因此重定向后,该值将不包含尾随.php,因此继续到第二个rewritecond,然后最终在内部重定向。第二次重定向后,两个条件都将无法匹配,从而停止进程

而在第二种情况下,重写规则检查来自uri 的值,这将删除.php 并重定向。重定向后,第二条规则将在内部重定向回带有 php 扩展名的 uri。然后最后在假定的第三个最终检查中,应该不匹配两个规则,第一个规则将再次匹配,从而无限循环整个过程。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-06-02
    • 2012-12-24
    • 1970-01-01
    • 2014-01-12
    • 2015-03-14
    • 1970-01-01
    • 2011-08-29
    • 2013-08-13
    相关资源
    最近更新 更多