RewriteRule获取与url的链接

时间:2013-07-27 12:27:28

标签: .htaccess mod-rewrite

我需要从网址获取链接。 例如:

http://mysite.com/site/http://myfriendsite.com/news/index.php?title=خبر&category=اقتصادی

site.php 获取链接http://myfriendsite.com/news/index.php?title=خبر&category=اقتصادی并显示此网址。

site.php代码:

<?php
if(isset($_GET['url_rss']))
{
    echo $_GET['url_rss'];
}
else
{
    echo '<h2>Error 404</h2>';
}
?>

我的.htaccess

Options +FollowSymLinks
RewriteEngine On

RewriteRule ^site/(.*) site.php?url=$1

但我看到http:/myfriendsite.com/news/index.php而不是http://myfriendsite.com/news/index.php?title=خبر&category=اقتصادی

2 个答案:

答案 0 :(得分:1)

您需要使用条件来获取查询字符串或标志QSA以在最后附加它:

RewriteCond %{QUERY_STRING} ^(.*)$
RewriteRule ^site/(.*) site.php?url=$1\?%1 [B]

您可以在您的site.php上使用以下内容:

$path = $_SERVER['REQUEST_URI'];
$url = substr($path, 6, strlen($path));

通过此规则,它将为您提供myfriendsite.com/news/index.php?title=خبر&category=اقتصادی

RewriteCond %{QUERY_STRING} ^(.*)$
RewriteRule ^site/[^/]*/(.*)$ site.php?url=$1\?%1 [B]

答案 1 :(得分:1)

这种URL无法在QUERY_STRING或RewriteRule中捕获,因为那时Apache会重新格式化URL并将http://...转换为http:/...

诀窍是使用%{THE_REQUEST}变量,它代表在网络服务器上收到的原始http请求。

通过httpd.conf启用mod_rewrite和.htaccess,然后将此代码放在.htaccess目录下的DOCUMENT_ROOT中:

Options +FollowSymLinks -MultiViews
# Turn mod_rewrite on
RewriteEngine On

RewriteCond %{THE_REQUEST} ^[A-Z]{3,}\s/+site/([^\s]+) [NC]
RewriteRule (?!^site\.php$)^ /site.php?url=%1 [L,B,NC]

PS:此处需要否定前瞻以防止无限循环。