php - .htaccess mod 重写规则和符号

标签 php .htaccess arguments

这两天我一直在为这个问题苦苦挣扎。

目前我有以下重写规则:

RewriteRule ^(.*)$ index.php?u=$1 [NC,L]

它将 example.com/后面的所有内容作为 GET 变量 u 移植到 index.php。这是在 index.php 中处理的,用爆炸来定义不同的参数是:城市(在第一个斜线之间)和位置(第二个参数)

这非常适用于以下网址:

example.com/City/location/或 example.com/City/location
example.com/City/或 example.com/City

产生:

$arg[0] = city
$arg[1] = location

当位置名称中包含“&”符号时会出现问题:

example.com/city/location&more

转换为:

index.php?u=city/location&more

问题很明显;我不能再在 index.php 中使用 explode 参数,因为位置名称的第二部分未存储在 $_GET['u'] 中。

我该如何解决这个问题?

我想到了三个我不知道如何实现的解决方案:
1) 重写重写规则以拆分.htaccess 中的城市和位置
2) 使用 .htaccess 等效的 urlencode 将 &-sign 转换为 %26
3) 一个完整的其他解决方案:)
提前致谢!

编辑 首先: 当我的网站生成链接时,它会使用 urlencode 进行翻译。所以不应该有 & 的地方没有。 & 是商业名称的一部分,例如:“Bagels&Beans” 当人们想要搜索该公司时,他们会在 url 字段中键入:www.example.com/city/bagels&beans。 这就是问题开始的地方。

编辑2 当我去:example.com/city/bagels%26Beans 它转换为以下内容:$_GET:

Array
(
    [u] => city/Bagels
    [Beans] => 
)

编辑 3 我分解 $_GET['u'] 以形成参数的方式。

$arg = explode('/',$_GET['u']);

最佳答案

您不需要将 URL 路径放在参数中。您可以像这样简单地解析原始请求的路径:

$_SERVER['REQUEST_URI_PATH'] = strtok($_SERVER['REQUEST_URI'], '?');
$segments = explode('/', trim($_SERVER['REQUEST_URI_PATH'], '/'));

现在您只需要这条规则来将请求重写到您的index.php:

RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule !^index\.php$ index.php [L]

附加条件是只重写不能映射到现有文件的请求。

关于php - .htaccess mod 重写规则和符号,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2027367/

相关文章:

java - 如何获取一个字符串并将其作为变量......?我什至不知道如何表达

php - 在代码[PHP/HTML]中发现语法错误

php - 运行代码时遇到运行时异常

apache - RedirectMatch 并包括 L 标志

.htaccess - 如何隐藏来自用户代理之一的重定向

c++ - 默认参数 : invalid use of 'this' outside of a non-static member function

php - 如何从需要 SUDO 的 php 调用 shell 脚本?

php - 试图在 prestashop 1.7 管理模块中加载 js 和 css 文件

php - Zend Framework 1 apache2 虚拟主机配置

javascript - 仅传递 javascript 中的第二个参数