【问题标题】:php GET variable gets interrupted with ampersand (&)php GET 变量被与符号 (&) 打断
【发布时间】:2025-12-28 03:21:51
【问题描述】:

解决方案:

似乎 htaccess 需要 'B' 才能保留 & 号 所以使用

RewriteRule ^album/([a-zA-Z0-9-=_.]+)$ view.php?album=$1 [L,B]

有效

解决方案

我正在尝试从 url 读取 get 值:

view.php?album=something

这是我在 .htaccess 文件中的规则之一:

#this rewrite 'view.php?album=something' to 'album/something'
RewriteRule ^album/([^/\.]+)/?$ ^view.php?album=$1 [L] 

问题在于,有时专辑名称(即'something')可能在名称中包含和&,这会导致$_GET 出错。

**For example** 
album name is 'football&basketball'

The view.php page will only read up to football and throw an error.

没有重写规则,它工作得很好,但是使用重写规则,它会在这种情况下搞砸。

我现在正在使用 rawurlencode

如果名称中没有 & ,那么它也可以正常工作 - 只有当它搞砸时才使用 &

有人对如何克服这个问题有任何建议吗?我尝试过使用 htmlspecialchars 和 htmlentities 等。

编辑:添加代码

htaccess:

<IfModule mod_rewrite.c>
RewriteEngine On

#rewrite view.php?album=whatever to album/whatever
RewriteRule ^album/([a-zA-Z0-9-=_.]+)$ view.php?album=$1 [L] 

RewriteCond %{REQUEST_FILENAME} !-f 
RewriteCond %{REQUEST_FILENAME} !-d

RewriteBase /ShyamJoshi/dist/ 

#remove .php and .html extension
RewriteRule ^([^\.]+)$ $1.php [NC,L]
RewriteRule ^([^\.]+)$ $1.html [NC,L]


RewriteOptions Inherit
ReWriteCond %{HTTP:accept-encoding} (gzip.*) 
ReWriteCond %{REQUEST_FILENAME} !.+\.gz$ 
RewriteCond %{REQUEST_FILENAME}.gz -f 
RewriteRule (.+) $1.gz [QSA,L] 

</IfModule>

PHP:

这个函数被使用了两次。首先它显示所有目录,然后它显示目录中的所有图像(这是'else'部分)

function getImagesOrImageDirs($dirOnly) {
    $dirLoc = getcwd() . '/images/events/';

    $allDirs = preg_grep('/^([^.])/', scandir($dirLoc));

    echo '<div class="row">';
    if ($dirOnly == true) {
      foreach($allDirs as $dir) {
        $innerDirImages = preg_grep('/^([^.])/', scandir($dirLoc.'/'.$dir));
        $firstImageOfDir = reset($innerDirImages);

        /* view.php?album=something -> rewritten by htaccess to albums/something*/
        $href = 'album/'.$dir;

        // $href = 'album/'.$dir;
        $imageSrc = 'images/events/'.$dir.'/'.$firstImageOfDir;

        echo albumAndPhotoTemplate($href, $imageSrc, true, $dir, 'col-xs-12 col-sm-3');
      }
    } else {
      if (empty ($_GET['album']) ) {
        return ;
      }
      $albumName = $_GET['album'];
      print_r($albumName);
      $dirLoc = $dirLoc .'/'.$albumName;
      $allImages = preg_grep('/^([^.])/', scandir($dirLoc));

      foreach($allImages as $image) {
        $imgSrcAndHref = 'images/events/'.$albumName.'/'.$image;
        echo albumAndPhotoTemplate($imgSrcAndHref, $imgSrcAndHref, false, '',  'col-xs-12, col-sm-3');
      }
    }
    echo '</div>';
  }

【问题讨论】:

    标签: php .htaccess url get


    【解决方案1】:

    像这样试试..

    RewriteEngine On
    
    RewriteRule ^album/([a-zA-Z0-9-=_.]+)$ view.php?album=$1 [L]
    

    使用

    获取变量
    $_GET['album'];
    

    如果你想要变量和名称:

    print_r($_GET);
    

    要在 url 上转义 &amp;,请像这样使用 %26..

    view.php?album=something%26basketball
    

    在此处查看更多信息escaping ampersand in url

    【讨论】:

    • 重写引擎已经启动,我正在使用 $_GET。当我“$_GET”它削减它的变量,我只得到它的价值到 &
    • 我明白你在做什么,但做 print_r($_GET) 仍然得到字符串到 &
    • 在网址中使用football%26basketball
    • 我已经尝试了上面的答案,但我似乎无法让它工作。我也在上面添加了我的代码