我想要一个像http://localhost/folder1/folder2/folder3/file这样的网址 然后我希望mod_rewrite将它转换为$ _GET ['d']在url中它看起来像d [] = folder1& d [] = folder2& d [] = folder3
这可能吗?
谢谢。
答案 0 :(得分:6)
是的,有可能:
RewriteRule ^(([^/]+/)*)([^/]+)/([^/]+)$ /$1$4?d[]=$3 [QSA,N]
RewriteRule ^([^/]+)$ - [L]
但是mod_rewrite并不适合那种工作。实际上,您可以使用N flag快速创建无限循环。
您应该使用PHP来提取其段的请求的URL路径:
$path = strtok($_SERVER['REQUEST_URI'], '?');
$segments = implode('/', ltrim($path, '/'));
然后使用此单一规则将请求重写为您的文件:
RewriteRule ^([^/]+/)+([^/]+)$ $2 [L]
答案 1 :(得分:2)
我不知道自动执行此操作的方法,但您可以从$ _SERVER ['REQUEST_URI']检索所请求的URL,并对其执行自己的字符串处理以提取所需的信息。
答案 2 :(得分:2)
这就是我为Seach Engine Friendly URL所做的事情,其中包含无限量的级别。它还允许您选择是否允许查询字符串,并且不会将URL重写为真实文件夹或文件,如图像,CSS和JavaScript。
...的Apache
# 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]
... 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;
}
?>
然后我有一个路由文件,用适当的函数处理请求。它可能看起来像很多代码,但有助于保持组织和效率,因为我只包含请求所需的类/函数。
我正在考虑发布一个代码库(Urgh,而不是我听到你哭的另一个框架)我用于我的项目,所以随意使用GPL v3下的代码。
希望这有帮助。
答案 3 :(得分:0)
这应该让你大致了解你需要什么......
Rewrite Rule ^(.*)/(.*)/(.*)/(.*)$ /my_script.php?d[]=$1&d[]=$2&d=$3&f=$4
如果你想支持任意数量的目录,而不是3个固定目录,那么这将是另一个问题。
答案 4 :(得分:0)
一个好的技术是前端控制器(MVC设计模式的一部分)。前端控制器是一个(PHP)文件,您的网站获取的每个请求都将被路由到该文件。然后,前端控制器根据请求的类型将请求分派给其他文件(查看第X页,提交表单Y等)。例如,您可以使用@Ray Hidayat描述的技术“切断”请求的网址,并查看它以确定您的网站的哪个部分应该处理和/或回答请求。
例如:Zend Framework和Drupal都使用这种技术。在这些情况下,我认为在大多数情况下,站点根目录中的index.php是前端控制器,所以www.example.com/index.php
您可以使用mod_rewrite将每个请求路由到前端控制器。
RewriteEngine on
RewriteRule .* index.php
您可以将以下mod_rewrite脚本用于images / files / CSS和javascript库。
RewriteEngine off
祝你好运!