Apache Mod_Rewrite Multiple Levels

时间:2014-02-09 05:41:42

标签: php apache .htaccess mod-rewrite

我的目标是使用.htaccess创建一些友好的URL。我需要一个mod_rewrite(用于.htaccess)解决方案,它允许我有以下URL:

http://www.example.com/admin/lots - > /admin/lots/index.php

http://www.example.com/admin/lots/edit/1 - > /admin/lots/edit.php?id=1

http://www.example.com/admin/lots/view/1 - > /admin/lots/view.php?id=1

http://www.example.com/admin/lots/view/more/1 - > /admin/lots/view/more.php?id=1

http://www.example.com/admin/settings - > /admin/settings/index.php

http://www.example.com/admin/settings/edit/1 - > /admin/settings/edit.php?id=1

http://www.example.com/admin/project/status/edit/1 - > /admin/project/status/edit.php?id=1

某些网址可能包含1到10个目录级别。这是不太可能的,但如果这个RewriteCond / Rule可以扩展,那就太好了。

但是,“编辑”,“id”和文件名可能不同。我认为解释这个问题很难实现,特别是因为有数百种可能性。

基本上,如果文件存在,我希望显示该文件,并且在文件名后面没有其他内容。如果它是一个文件并且在文件名后面有更多,则假设它是一个变量。如果它是一个没有其他内容的目录,我会更喜欢,如果它可以转到目录索引(在这种情况下为index.php)。如果它是一个带有文件名的目录,我希望显示该文件。

请注意,如果网址的一部分既不是目录也不是文件,请假设它是查询的一部分,例如?id=1

如果有必要,我可以把它放在服务器配置中,但是,我想保持简单愚蠢。

3 个答案:

答案 0 :(得分:0)

我从Zend Framework中识别出这种URL模式。 Zend Framework如何实现它,将所有内容重写为index.php,引导应用程序,并根据应用程序中设置的路由配置进行实际路由。

如果这只在/admin/子目录中,您可以创建以下重写(基于Zend的默认.htaccess):

RewriteCond %{REQUEST_FILENAME} -s [OR]
RewriteCond %{REQUEST_FILENAME} -l [OR]
RewriteCond %{REQUEST_FILENAME} -d
RewriteRule ^admin/.*$ - [NC,L] # Do not rewrite if it is an actual file/link/directory
RewriteRule ^admin/.*$ /admin/router.php [NC,L] # Rewrite to the router.php

router.php中,您可以使用$_SERVER['REQUEST_URI']来解析URL,在$_SERVER['QUERY_STRING']中设置变量,并为给定的URL包含正确的PHP,例如。< / p>

对于RewriteCond用法,请检查:http://httpd.apache.org/docs/2.2/mod/mod_rewrite.html#rewritecond

答案 1 :(得分:0)

让我们开始

首先,您需要将以下代码放在名为.htaccess的文件中,无论您处理的是哪个目录:

RewriteEngine on

现在mod_rewrite模块已打开,并准备接受进一步的指令。 RewriteRule命令是模块的根,它告诉mod_rewrite要做什么。这是它的语法:

RewriteRule Pattern Substitute(可选标志)

以下是一个例子:

RewriteRule /articles/([0-9]+) /articles.php?id=$1
  

这将取代http://www.yoursite.com/articles/1/   http://www.yoursite.com/articles.php?id=1

您也不必将自己限制在数字之内,您也可以使用[a-z]或[A-Z]!

以下是您可以使用的一些标志:

f: send a 403 forbidden error to the browser
NC: make the rule case-insensitive
g: send a 410 gone error to the browser

您不仅可以使用规则重写URL,还可以为这些规则添加条件,因此不会在每种情况下执行它们:

RewriteCond测试条件

以下是您可以对条件做些什么的示例:

RewriteCond %{HTTP_USER_AGENT} ^Opera.*
RewriteRule ^/$ /index_opera.php [L]

RewriteCond %{HTTP_USER_AGENT} ^Netscape.*
RewriteRule ^/$ /index_netscape.php [L]

RewriteRule ^/$ /index.php [L]

这将为Opera和Netscape加载一个特殊页面,并为不使用Netscape的人加载默认页面。以下是您可以在条件中使用的一些变量:

HTTP_USER_AGENT (browser)
HTTP_REFERER (referring page)
HTTP_HOST (domain name - yoursite.domain.com)
TIME, TIME_YEAR, TIME_DAY, TIME_HOUR, TIME_MIN, TIME_SEC

开始工作!

现在我(希望)已经满足了你的胃口,你可以开始研究mod_rewrite的一些很好用途。以下是可以实现的一些示例:

/books/456/ » /index.php?mode=books&id=456
/books/456/buy » /index.php?mode=buy&id=456
/book_456.html » /index.php?book=456

...并使用mod_rewrite创建漂亮的网址

Apache重写引擎主要用于转换动态URL,例如:

  

www.yoursite.com/product.php?id=123进入静态和用户友好   url's,例如www.yoursite.com/product/123

RewriteEngine on
RewriteRule ^product/([^/.]+)/?$ product.php?id=$1 [L]

另一个例子,改写自:

  

www.yoursite.com/script.php?product=123 to   www.yoursite.com/cat/product/123 /

RewriteRule cat/(.*)/(.*)/$ /script.php?$1=$2

答案 2 :(得分:0)

您可以在 /admin/.htaccess

中使用此代码
RewriteEngine On
RewriteBase /admin/

RewriteCond %{ENV:REDIRECT_STATUS} 200 [OR]
RewriteCond %{REQUEST_FILENAME} -d [OR]
RewriteCond %{REQUEST_FILENAME} -f [OR]
RewriteCond %{REQUEST_FILENAME} -l
RewriteRule ^ - [L]

RewriteRule ^([^/]+)/?$ $1/index.php [L]

RewriteRule ^(.+?)/([^/]+)/([^/]+)$ $1/$2.php?id=$3 [L]