将 MVC URL 重写到不同的目录
Rewrite MVC URL to different directories
目前我有一个 PHP MVC 项目需要 URL 重写以获得更好的可用性。但是,该项目可以安装在不同的目录中,我无法编写可以处理这两种情况的正常工作的 .htaccess:
- /var/www/html/testapp/ - 直接访问:127.0.0.1/testapp
- /var/www/html/specific_installation_number_4 - 虚拟主机:www.testapp4.org
如您所见,我必须使用不同的基本 URI。项目结构如下所示:
testapp/
index.php
.htaccess
public/
css/
style.css
js/
script.js
vendor/
frameworks/
jquery/
twitter/
bootstrap/
index.php:
<?php
echo("GET: ");
var_dump($_GET);
echo("<br>URI: " . $_SERVER["REQUEST_URI"]);
?>
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<script src="vendor/frameworks/jquery/jquery.min.js"></script>
<script src="vendor/twitter/bootstrap/dist/js/bootstrap.min.js"></script>
<script src="public/js/script.js"></script>
<link href="vendor/twitter/bootstrap/dist/css/bootstrap.min.css" rel="stylesheet">
<link href="public/css/style.css" rel="stylesheet">
<title>Testapp</title>
</head>
<body>
<h1>Testapp</h1>
<p>Not implemented yet!</p>
</body>
</html>
.htaccess(反复试验...):
RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^.*$ index.php [NC,L]
所以想法是 REQUEST_URI 应该具有以下值:
(empty) (System will use the fallback controller)
mycontroller
mycontroller/action
mycontroller/action/42
问题:
- 谁能post/hint给我一个可用的版本?
- 任何人都可以向我解释 .htaccess 中的 idea/used 语法吗?
最后我真的放弃了从两个不同的目录重写的可能性,也就是两个不同的基本 URI。我刚刚在我的本地系统中添加了一个虚拟主机 (www.test.com)。对于感兴趣的人,.htaccess 看起来像这样:
# Enable rewriting
RewriteEngine On
# Skip the public and vendor directories
RewriteRule ^(public|vendor)($|/) - [L]
# Skip existing files and directories
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
# Rewrite the URL
RewriteRule ^(.*)$ index.php [QSA,L]
注意:js、css、图片等附加文件的输入源必须是绝对的:
<link href="/public/css/style.css" rel="stylesheet">
目前我有一个 PHP MVC 项目需要 URL 重写以获得更好的可用性。但是,该项目可以安装在不同的目录中,我无法编写可以处理这两种情况的正常工作的 .htaccess:
- /var/www/html/testapp/ - 直接访问:127.0.0.1/testapp
- /var/www/html/specific_installation_number_4 - 虚拟主机:www.testapp4.org
如您所见,我必须使用不同的基本 URI。项目结构如下所示:
testapp/
index.php
.htaccess
public/
css/
style.css
js/
script.js
vendor/
frameworks/
jquery/
twitter/
bootstrap/
index.php:
<?php
echo("GET: ");
var_dump($_GET);
echo("<br>URI: " . $_SERVER["REQUEST_URI"]);
?>
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<script src="vendor/frameworks/jquery/jquery.min.js"></script>
<script src="vendor/twitter/bootstrap/dist/js/bootstrap.min.js"></script>
<script src="public/js/script.js"></script>
<link href="vendor/twitter/bootstrap/dist/css/bootstrap.min.css" rel="stylesheet">
<link href="public/css/style.css" rel="stylesheet">
<title>Testapp</title>
</head>
<body>
<h1>Testapp</h1>
<p>Not implemented yet!</p>
</body>
</html>
.htaccess(反复试验...):
RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^.*$ index.php [NC,L]
所以想法是 REQUEST_URI 应该具有以下值:
(empty) (System will use the fallback controller)
mycontroller
mycontroller/action
mycontroller/action/42
问题:
- 谁能post/hint给我一个可用的版本?
- 任何人都可以向我解释 .htaccess 中的 idea/used 语法吗?
最后我真的放弃了从两个不同的目录重写的可能性,也就是两个不同的基本 URI。我刚刚在我的本地系统中添加了一个虚拟主机 (www.test.com)。对于感兴趣的人,.htaccess 看起来像这样:
# Enable rewriting
RewriteEngine On
# Skip the public and vendor directories
RewriteRule ^(public|vendor)($|/) - [L]
# Skip existing files and directories
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
# Rewrite the URL
RewriteRule ^(.*)$ index.php [QSA,L]
注意:js、css、图片等附加文件的输入源必须是绝对的:
<link href="/public/css/style.css" rel="stylesheet">