将“ page.php / page.php”重定向到普通的page.php

时间:2019-05-16 10:14:56

标签: .htaccess redirect

某些人留下了错误的网站链接类型,例如:

name    sent    received
John    4       3
Jim     5       2
Luis    3       1

正确的链接必须是:

https://example.com/subdir/3.php/3.php

请告诉我URL中有两个“ page.php”时如何使用https://example.com/subdir/3.php ,以及如何将其重定向到正确的页面?

1 个答案:

答案 0 :(得分:0)

有趣的问题...

要删除看起来像.php文件的URL路径上的最后一个重复路径段,则可以使用mod_rewrite在.htaccess中执行以下操作:

RewriteEngine On

# Remove last repeating path segment that "looks like" a PHP file
RewriteRule ^(.+/)?([\w-]+\.php)/\2$ /$1$2 [R=302,L]

这不检查URL是否映射到实际文件,仅检查它是否“看起来像” .php文件。

说明:

  • (.+/)?-匹配任何路径深度,并且是可选的,因此我们可以匹配文档根目录中的文件。这是在$1反向引用中捕获的。
  • ([\w-]+\.php)-匹配.php文件名。文件名可以包含字符a-zA-Z0-9_和/或-。这是在$2反向引用中捕获的。
  • /\2-与斜杠匹配,后跟重复的文件名,如上所示。 \2是对第二个捕获组的内部反向引用。

然后,我们重定向到/$1$2-将URL路径和文件名连接在一起,在初始请求的末尾省略“重复的”文件名。

以上内容将重定向以下所有内容(例如):

  • /subdir/3.php/3.php/subdir/3.php
  • /index.php/index.php/index.php
  • /foo/bar/baz/test-123.php/test-123.php/foo/bar/baz/test-123.php
  • /subdir/3.php/3.php/3.php/subdir/3.php/3.php/subdir/3.php(多次重定向)

更新:

  

但是/之后的随机字母和数字呢?例如-/subdir/3.php/blala。

对于更通用的版本,它去除了网址中.php/之后的所有内容,您可以改为执行以下操作:

# Strip everything after what looks like a PHP file
RewriteRule ^(.+?\.php)/ /$1 [R=302,L]

请注意,这些当前是302(临时)重定向。如果您打算这样做,则可能要考虑将它们更改为301(永久),一旦确认它们可以正常工作即可。

如果要链接到实际的.php文件,则有效文件之后的所有内容都称为附加路径名信息或路径信息(可在PATH_INFO服务器中使用变量)。 URL上的path-info是否完全有效(默认情况下)取决于Apache处理程序(在这种情况下为PHP处理程序)。像/subdir/foo.html/bar这样的URL(其中foo.html是有效文件)实际上会产生404(与PHP文件的处理方式相反)。您还可以通过在Apache配置或.htaccess文件中设置以下内容来禁用PHP文件的路径信息:

AcceptPathInfo Off

这将导致任何包含触发系统生成的404的路径信息的URL。通常,这是这种情况的更常见处理方式。