【问题标题】:How to get the .htaccess mod_rewrite to work? [duplicate]如何让 .htaccess mod_rewrite 工作? [复制]
【发布时间】:2014-07-02 07:14:09
【问题描述】:

以下是几个 URL 示例:

domain.com/?view=home&action=update
domain.com/?view=home&page=1&action=update
domain.com/?view=home&action=update&page=2&sort=desc
domain.com/?view=home&sort=desc&page=2&action=update

如何使我的 .htaccess 将 URL(上述任何格式)重写为以下结构:

domain.com/home/1/desc/update

不同情况下get参数的数量不同,参数的顺序也不同。

此外,我需要能够 $_GET 用 PHP 重写后的值。

应用程序将使用以下键作为查询字符串:

view, item, page, sort, dir, action.

所有这些都是可选的,我以后可能需要添加更多。

我尝试了所有这些单独的,没有一个工作:

RewriteRule ^(.*)$ index.php/$1 [L]
RewriteRule ^/([^?]*)$ /index.php?$1 [NC,L,QSA]
RewriteRule ^([^?]*)$ /index.php?path=$1 [NC,L,QSA]
RewriteRule ^(.*)$ index.php?params=$1 [NC]

谢谢。

【问题讨论】:

  • 你尝试过哪些规则?
  • 添加到原始问题
  • 我知道我需要更好地学习 mod rewrite 和 regex,但现在我有一个任务需要处理。
  • @Prix,在本例中不起作用,因为查询键的顺序严格,而在我的情况下它们不是。

标签: php apache .htaccess mod-rewrite query-string


【解决方案1】:

而不是重写为domain.com/home/1/desc/update,在我看来,您希望用户能够点击这样的链接:domain.com/home/1/desc/update,并将该网址在内部重写为查询表单,以便您可以提取 PHP 中的变量(用户不会看到查询 url)。

您为我们提供了一个包含四个变量的 url 示例:domain.com/home/1/desc/update,但在其他地方您说还有两个:diritem

为了可靠地从像domain.com/home/1/desc/update 这样的url 中提取参数,它必须是可靠的格式。因此,

  • 要么确保每个 url 包含六个参数,例如domain.com/home/1/desc/update/dir_value/item_value
  • 或者你在 url 中包含键名,这样 url 的“文件夹”就是一系列键值对:domain.com/view/home/page/1/sort/desc/action/update

一旦你做出了选择,重写就成为可能,但在那之前是不可能的。

【讨论】:

  • 这有帮助,谢谢。
  • 接受,谢谢。选择第一个选项并根据我的需要使用 php 进行调整。
【解决方案2】:

不同情况下get参数的数量不同,如 以及参数的顺序。

这是个问题。 mod_rewrite 的问题是您需要某种结构来将 domain.com/home/1/desc/update 的良好 SEO 友好 URL 过滤为 domain.com/?view=home&page=1&sort=desc&action=update 之类的东西。因此,这样的事情可以让您以特定顺序捕获任何或所有细分:

RewriteEngine On

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

RewriteRule ^([a-z0-9]+)/?([^/]*)$ index.php?q=$1&$2 [QSA]
RewriteRule ^([a-z0-9]+)/([a-z0-9]+)/([a-z0-9]+)/([a-z0-9]+)/?$ index.php?view=$1&sort=$2&page=$3&action=$4 [L]
RewriteRule ^([a-z0-9]+)/([a-z0-9]+)/([a-z0-9]+)/?$ index.php?view=$1&sort=$2&page=$3 [L]
RewriteRule ^([a-z0-9]+)/([a-z0-9]+)/?$ index.php?view=$1&sort=$2 [L]
RewriteRule ^([a-z0-9]+)/?$ index.php?view=$1 [L]

如果你把下面的代码放在index.php:

echo '<pre>';
print_r($_GET);
echo '</pre>';

输出将是:

Array
(
    [view] => home
    [sort] => 1
    [page] => desc
    [action] => update
)

但如果您确定需要处理随机结构化的 SEO 友好 URL,那么此规则应该有效:

RewriteEngine On

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

RewriteRule ^(.*)$ index.php?url_path=$1 [L]

现在它不会重定向任何东西,但它会捕获/home/1/desc/update 的整个路径并将其设置在$_GET 数组中,并使用名为url_path 的键。然后,您可以像这样在 index.php 中检查该变量中的内容:

echo '<pre>';
print_r($_GET);
echo '</pre>';

$segments = explode('/', $_GET['url_path']);

echo '<pre>';
print_r($segments);
echo '</pre>';

结果是这样的:

Array
(
    [url_path] => home/1/desc/update
)

Array
(
    [0] => home
    [1] => 1
    [2] => desc
    [3] => update
)

【讨论】:

  • 在这种情况下的问题是 $_GET 数组的键丢失了,而是提供了索引,当键值对的顺序是随机的时,这无济于事。
  • @Piero 正确。但这也是我们这里的问题,因为 SEO 友好的 URL 并不神奇。它们是正则表达式假设,即 URL 的这一部分在捕获时将等同于该键。如果 GET 值存在某种逻辑模式,则可以使用某种逻辑过滤这些值。但是没有干净的方法来处理这样的事情。我的回答提供了可以使用的选项。
猜你喜欢
  • 1970-01-01
  • 2017-06-12
  • 2010-10-31
  • 2011-07-31
  • 1970-01-01
  • 2015-12-02
  • 2013-09-15
  • 2011-03-08
  • 2012-08-05
相关资源
最近更新 更多