尝试重写链接时重写Mod给内部服务器错误

时间:2013-05-01 14:58:29

标签: php html .htaccess

讨论重写mod问题有很多问题。我读过它们,没有人解决我的独特问题。我已经做了3个小时的研究来解决它,但我仍然陷入困境。

我想通过file_get_contents() PHP函数重写从远程站点检索到的源代码中的链接。

当我获得源代码时,链接结构是:

<a href='javascript:openWindow("index1.php?option=com_lsh&view=lsh&event_id=148730&tv_id=850&tid=34143&channel=0&tmpl=component&layout=popup&Itemid=335","735","770")'  >Link#1</a>

我想将其重写为:

<a href='javascript:openWindow("http://remotesite.com/index1.php?option=com_lsh&view=lsh&event_id=148730&tv_id=850&tid=34143&channel=0&tmpl=component&layout=popup&Itemid=335","735","770")'  >Link#1</a>

经过一番研究后,我认为重写mod可以解决问题。我试着将下面的代码放在我的.htaccess文件中:

Options +FollowSymLinks
RewriteEngine On
RewriteBase /
RewriteRule ^index1\.php?option - [L]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule  http://remotesite/index1.php?option [L]

然而,它给我内部服务器错误。

我在这里做错了什么?是否有其他方法以上述方式重写链接结构?

3 个答案:

答案 0 :(得分:0)

试试这个:

<IfModule mod_rewrite.c>
    RewriteEngine On
    RewriteCond %{HTTP_HOST}   !^www\.example\.com [NC]
    RewriteCond %{HTTP_HOST}   !^$
    RewriteRule ^/(.*)         http://www.example.com/$1 [L,R]
</IfModule>

答案 1 :(得分:0)

您无法在重写规则中与查询字符串进行匹配。此外,mod_rewrite 无法重写您的内容。您需要使用某种反向代理,如mod_proxy_html,以便动态重写您的内容。重写引擎仅在服务器收到请求时应用,因此一旦请求到达您的服务器(具有htaccess文件的服务器),您可以执行的嵌套是重定向(或使用P标志反向代理)

您所拥有的任何规则都不会导致500内部服务器错误,但它们无法正常工作,因为您无法在重写规则中匹配查询字符串,此外,规则需要模式和目标。你的第二条规则只有一个没有模式的目标。最有可能的是,未加载mod_rewrite会导致500内部服务器错误。除此之外,请检查您的错误日志。

Options +FollowSymLinks
RewriteEngine On
RewriteBase /
RewriteRule ^index1\.php http://remotesite/index1.php [L,QSA,P]

答案 2 :(得分:0)

经过6个多小时的研究,我设法通过mod_rewrite方法以外的方式解决了这个问题,这里是详细信息

诀窍很简单我刚从get file content方法更改为curl with more options

下面是我使用的代码:

<?php
    //Get the url
    $url = "http://remotesite.com";

    //Get the html of url
    function get_data($url) 
    { 
       $ch = curl_init();
       $timeout = 5;
       //$userAgent = "Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US)AppleWebKit/525.13 (KHTML, like Gecko) Chrome/0.X.Y.Z Safari/525.13.";
       $userAgent = "IE 7 – Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1; .NET CLR 1.1.4322; .NET CLR 2.0.50727; .NET CLR 3.0.04506.30)";
      curl_setopt($ch, CURLOPT_USERAGENT, $userAgent);
      curl_setopt($ch, CURLOPT_FAILONERROR, true);
      curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true);
      curl_setopt($ch, CURLOPT_AUTOREFERER, true);
      curl_setopt($ch, CURLOPT_TIMEOUT, 10);
      curl_setopt($ch,CURLOPT_URL,$url);
      curl_setopt($ch,CURLOPT_RETURNTRANSFER,1);
      curl_setopt($ch,CURLOPT_CONNECTTIMEOUT,$timeout);
      $data = curl_exec($ch);
      curl_close($ch);
      return $data;

    }

    $html = file_get_contents($url);
    echo '<base href="http://remotesite.com/" />';
    echo $html;
?>

将每条相对路径更改为绝对路径的技巧如下:

echo '<base href="http://remotesite.com/" />';

感谢@Jon lin,@ ahmed求助