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('&', $_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 重定向的主要内容,如果未能解决你的问题,请参考以下文章
.htaccess - 将所有 URL + 现有目录重定向到 index.php