PHP 中的 URL 重定向

Posted

技术标签:

【中文标题】PHP 中的 URL 重定向【英文标题】:Url redirection in PHP 【发布时间】:2011-02-08 08:41:04 【问题描述】:

我有一个类似的网址 http://localhost/joomla/Joomla_1.5.7/index.php?option=com_content&view=section&layout=blog&id=3&Itemid=55

我想把它重定向到 http://localhost/joomla/Joomla1.5/index.php?option=com_content&view=section&layout=blog&id=3&Itemid=55

不仅是这种重定向,而且每当我在 Joomla_1.5.7/ 旁边有任何东西时,我都会尝试将其附加到 Joomla1.5 .. 如何在 PHP 中做到这一点...... 如何识别url包含Joomla_1.5.7之后的东西来获取??

编辑: ## 如果导致错误可以被注释掉,见上面的注释。 选项 +FollowSymLinks

#
  #  mod_rewrite in use

  RewriteEngine On

########## Begin - Rewrite rules to block out some common exploits
   ## If you experience problems on your site block out the operations listed below
   ## This attempts to block the most common type of exploit `attempts` to Joomla!
   #
   # Block out any script trying to set a mosConfig value through the URL
   RewriteCond %QUERY_STRING mosConfig_[a-zA-Z_]1,21(=|\%3D) [OR]
    # Block out any script trying to base64_encode crap to send via URL
  RewriteCond %QUERY_STRING base64_encode.*\(.*\) [OR]
  # Block out any script that includes a <script> tag in URL
 RewriteCond %QUERY_STRING (\<|%3C).*script.*(\>|%3E) [NC,OR]
 # Block out any script trying to set a PHP GLOBALS variable via URL
 RewriteCond %QUERY_STRING GLOBALS(=|\[|\%[0-9A-Z]0,2) [OR]
# Block out any script trying to modify a _REQUEST variable via URL
RewriteCond %QUERY_STRING _REQUEST(=|\[|\%[0-9A-Z]0,2)

# 将所有被阻止的请求发送到主页,并出现 403 Forbidden 错误! RewriteRule ^(.*)$ index.php [F,L] # ########## End - 重写规则以阻止一些常见漏洞

#  Uncomment following line if your webserver's URL
#  is not directly related to physical file paths.
#  Update Your Joomla! Directory (just / for root)

# RewriteBase /


  ########## Begin - Joomla! core SEF Section

# RewriteCond %REQUEST_FILENAME !-f RewriteCond %REQUEST_FILENAME !-d RewriteCond %REQUEST_URI !^/index.php RewriteCond %REQUEST_URI (/|.php|.html|.htm|.feed|.pdf|.raw|/[^.])$ [NC] 重写规则 (.) index.php RewriteRule .* - [E=HTTP_AUTHORIZATION:%HTTP:Authorization,L] # ########## 结束 - Joomla!核心 SEF 部分

 RewriteEngine on
 RewriteCond %REQUEST_URI ^/joomla/Joomla_1\.5\.7/.*
 RewriteRule ^(.*)$ http://%HTTP_HOST/joomla/Joomla1.5/$1 [R=301,L]

是我的 htaccess 文件中的内容,但它仍然显示了我网站中的任何更改。

【问题讨论】:

这和你三个小时前问的问题一样:***.com/questions/2644217/… 【参考方案1】:

您可以使用这样的 htaccess 文件来做到这一点:

RewriteEngine on
RewriteRule ^joomla/Joomla_1.5.7/(.*?)$ joomla/Joomla1.5/$1 [L,QSA]

但是如果你绝对想用 PHP 来实现,把它放在旧的 index.php 中:

header("Status: 301");
header("Location: http://localhost/joomla/Joomla1.5/index.php".(!empty($_GET) ? '?'.http_build_query($_GET) : ''));
exit;

【讨论】:

implode('&amp;', $_GET) 将产生 value1&value2&value3,并在数组上中断(例如 value1&Array&Array&value4 生成错误)。改为查看php.net/http_build_query。 这仍然会在数组上中断,因为它没有递归。不是http_build_query() 的粉丝? +1 对于 mod_rewrite 解决方案,我将 R=permanent 添加到规则中(使其成为 301 重定向),因此: RewriteRule ^joomla/Joomla_1.5.7/(.*?)$ joomla /Joomla1.5/$1 [R=永久,L,QSA] 在答案中添加了 R=permanent。另外,pinkgothic,我什至不知道存在这样的功能。让我看一下,然后我会更新答案......编辑:更新 我在自己的主机上尝试了 R=permanent,但这搞砸了一些事情。我现在将其从答案中删除。不过,我认为如果您重定向到一个全新的 URL,它会起作用。【参考方案2】:

如果您有 mod_rewrite,则在您的 .htaccess 中您可以按照以下方式添加内容:

RewriteEngine on

RewriteCond %REQUEST_URI ^/joomla/Joomla_1\.5\.7/.*
RewriteRule ^(.*)$ http://%HTTP_HOST/joomla/Joomla1.5/$1 [L]

基本上,它匹配任何以 /joomla/Joomla_1.5.7/ 开头的传入 URL,并将其重定向到 /joomla/Joomla1.5/,所有额外参数保持不变,但用户地址中的 URL 不会更改吧。

如果要更改网址,可以将最后一行改为

RewriteRule ^(.*)$ http://%HTTP_HOST/joomla/Joomla1.5/$1 [R=301,L]

希望这就是你要找的东西!

【讨论】:

以上是关于PHP 中的 URL 重定向的主要内容,如果未能解决你的问题,请参考以下文章

wordpress url 重定向挂钩 | PHP |

如何用 PHP 实现 302 重定向到其他 URL

PHP检测url是不是重定向并重试重定向

.htaccess - 将所有 URL + 现有目录重定向到 index.php

Laravel - 以 .php 结尾的重定向捕获/重定向 URL

PHP url重定向