apachemod_重写和PHP GET数组

apachemod_重写和PHP GET数组,php,arrays,mod-rewrite,get,Php,Arrays,Mod Rewrite,Get,我想有一个像这样的网址 然后我希望mod_rewrite将它转换为$_GET['d'],在url中它看起来像d[]=folder1&d[]=folder2&d[]=folder3 这可能吗 谢谢。我不知道自动执行的方法,但是您可以从$\u服务器['REQUEST\u URI']检索请求的URL,并对其执行您自己的字符串处理,以提取您想要的信息。这应该让您大致了解您需要什么 Rewrite Rule ^(.*)/(.*)/(.*)/(.*)$ /my_script.php?d[]=$1&d

我想有一个像这样的网址 然后我希望mod_rewrite将它转换为$_GET['d'],在url中它看起来像d[]=folder1&d[]=folder2&d[]=folder3

这可能吗


谢谢。

我不知道自动执行的方法,但是您可以从$\u服务器['REQUEST\u URI']检索请求的URL,并对其执行您自己的字符串处理,以提取您想要的信息。

这应该让您大致了解您需要什么

Rewrite Rule ^(.*)/(.*)/(.*)/(.*)$ /my_script.php?d[]=$1&d[]=$2&d=$3&f=$4

如果您想支持任意数量的目录,而不是3个固定目录,那将是另一个问题。

一个好的技术是使用前端控制器(MVC设计模式的一部分)。前端控制器是一个(PHP)文件,您的网站收到的每个请求都会被路由到该文件。然后,前端控制器根据请求的类型将请求发送给其他文件(参见第X页,提交表格Y等)。例如,您可以使用@Ray Hidayat描述的技术“剪切”请求的url,并查看它以确定站点的哪个部分应该处理和/或响应请求

例如:Zend框架和Drupal都使用这种技术。在这些情况下,我认为在大多数情况下,站点根目录中的index.php是前端控制器,因此www.example.com/index.php

您可以使用mod_rewrite将每个请求路由到前端控制器

RewriteEngine on
RewriteRule .* index.php
您可以为图像/文件/CSS和javascript库使用以下mod_重写脚本

RewriteEngine off
祝你好运

是的,有可能:

RewriteRule ^(([^/]+/)*)([^/]+)/([^/]+)$ /$1$4?d[]=$3 [QSA,N]
RewriteRule ^([^/]+)$ - [L]
但是mod_rewrite并不适合这种工作。事实上,您可以使用快速创建无限循环

您应该使用PHP提取请求的URL路径及其段:

$path = strtok($_SERVER['REQUEST_URI'], '?');
$segments = implode('/', ltrim($path, '/'));
然后使用此单一规则将请求重写到您的文件中:

RewriteRule ^([^/]+/)+([^/]+)$ $2 [L]

这就是我为Seach引擎友好的URL所做的,它具有无限的级别。它还提供了允许或不允许查询字符串的选项,并且不会将URL重写为真正的文件夹或文件,如图像、CSS和JavaScript

阿帕奇

# Do not use htaccess if you can avoid it, instead write all of this in the httpd.conf <VirtualHost /> and disable .htaccess for performance/security.
RewriteEngine On
RewriteBase /

# Redirect non-www traffic to www.domain.co.uk/request
RewriteCond %{HTTP_HOST} !^www\.domain\.co\.uk$ [NC]
RewriteRule ^(.*)$ http://www.domain.co.uk/$1 [R=301,L]

# Do not rewrite real files
RewriteCond %{REQUEST_FILENAME} -f [OR]
RewriteCond %{REQUEST_FILENAME} -d
RewriteRule ^.*/ - [L]

# Use 1 or 2 Below

# 1. SEO Friendly URLs (don't allow additional query strings /foo/bar/)
# RewriteRule ^([A-Za-z0-9/-]*)$ index.php?request=$1 [L]

# 2. SEO Friendly URLs (allow additional query strings /foo/bar/?q=search)
RewriteRule ^([A-Za-z0-9/-]*)$ index.php?request=$1 [L,QSA]
#如果可以避免,请不要使用htaccess,而是将所有这些内容写入httpd.conf并禁用.htaccess以提高性能/安全性。
重新启动发动机
重写基/
#将非www流量重定向到www.domain.co.uk/request
重写cond%{HTTP_HOST}^www\.domain\.co\.uk$[NC]
重写规则^(.*)$http://www.domain.co.uk/$1[R=301,L]
#不要重写真实的文件
RewriteCond%{REQUEST_FILENAME}-f[或]
RewriteCond%{REQUEST_FILENAME}-d
重写规则^.*/-[L]
#使用下面的1或2
# 1. SEO友好的URL(不允许额外的查询字符串/foo/bar/)
#重写规则^([A-Za-z0-9/-]*)$index.php?请求=$1[L]
# 2. SEO友好URL(允许附加查询字符串/foo/bar/?q=search)
重写规则^([A-Za-z0-9/-]*)$index.php?请求=$1[L,QSA]
PHP

<?php

/*
    Title: Request
    Gets the client request and sanitizes the user input.

    Returns:
        Array of parts of the URL.

        > $request = /path/to/page/
        > var_dump($request);
        > array(3) { [0]=>  string(4) "path" [1]=>  string(2) "to" [2]=>  string(4) "page" }
*/

// Check request exists
if (isset($_GET['request']) && !empty($_GET['request']))
{
    // Yes. Sanitize request.
    // request should be made lowercase, as URLs should not be case-sensitive.
    $request = strtolower($_GET['request']);

    // Sanitize request incase the user tries to circumvent the .htaccess rules and uses the query string directly. index.php?request=
    $request = preg_replace("([^a-z0-9-/])", '', $request);

    // Check if request ends with trailing slash to ensure all crawled URLs end with a trailing slash. ($request does not include other query strings or anchors)
    if ((substr($request, -1, 1)) == '/')
    {
        // Yes, request should now be safe to use.
        $safe['url'] = $request;

        // Split request into an array with values for each directory.
        $safe['request'] = explode('/', $request, -1);

        // Destroy user input to prevent usage.
        unset($_GET['request'], $request);
    }
    else
    {
        // No, redirect to request with trailing slash.
        header('Location: /' . $request . '/', true, 301);
        exit;
    }
}
else
{
    // No.
    $safe['request'] = false;
}

?>

然后,我有一个路由文件,它使用适当的函数处理请求。它可能看起来有很多代码,但有助于保持事情的组织性和高效性,因为我只包含请求所需的类/函数

我正在考虑发布一个用于我的项目的代码库(呃,不是我听到你哭喊的另一个框架),所以可以在GPLv3下随意使用这些代码


希望这有帮助。

我想要任意目录。。。可能吗?mike,如果你使用类似于这个答案中的技术,这是可能的:直接解析请求URI有时是最好的选择。有一些事情mod_rewrite并不是非常有效——一个例子是试图重写包含“&”和“?”字符的URL。然而,mod_重写的性能要比PHP重写高出许多倍,这在某些情况下可能很重要。我的回答与主题无关,但我认为如果您想要复杂的url,这种技术非常有效。