2014-02-09 44 views
-1

我的目标是使用.htaccess制作一些友好的URL。我需要一个mod_rewrite的(对的.htaccess)解决方案,可以让我有这样的URL:Apache Mod_Rewrite多个级别

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”和文件名可能不同。我认为解释这一点非常困难,尤其是因为有数百种可能性。

基本上,我想显示该文件是否存在,并且在URL中的文件名后面没有其他内容。如果它是一个文件,并且在文件名后有更多,则假定它是一个变量。如果它是一个没有任何其他内容的目录,我会更喜欢如果它可以去目录索引(在这种情况下index.php)。如果它是一个文件名后面的目录,我想要显示该文件。

请记住,如果URL的一部分既不是目录或文件,假设它是查询的一部分,如?id=1

如果需要,我可以把它的服务器配置,但是,我想保持简单愚蠢。

+1

转到一个重写规则:抛开一切,是不是现有的文件在根目录下的一个文件,并让该文件找出哪些文件包含了PHP函数的全部范围的设置。更容易维护,然后大量的重写规则,并且更容易编码。 – Wrikken

+0

@Wrikken我会认为这样做效率很低。大型Web应用程序如何处理这些类型的URL? – 1234567

+1

他们完全按照我所说的去做:P(嗯,无论是这样,还是大型网站只是预渲染他们的所有网页,并确保这些网址实际存在)。为什么它会消耗PHP的更多资源来询问是否存在文件,然后让Apache询问文件是否存在?特别是如果你打算在那里运行一个php文件,那么最好在那个时候使它成为include语句。即使这样也不能说服你:你是否想过在PHP中花更多的时间来做这件事情与你将要实际运行的PHP文件的时间相比是否有意义? – Wrikken

回答

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。

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

+0

绝妙的主意。但是,我遇到了一个Apache的小错误: '重写规则:坏标志分隔符'。没有提供线路信息。这就是它所说的(根据有用的信息)。 – 1234567

+0

糟糕。 '[NC,L]'应该没有空格。 –

+0

我对此表示歉意。我应该先抓住它。我不是'mod_rewrite'大师。我会试试看看它是如何工作的。 – 1234567

0

让我们开始

首先,你需要把下面的代码放在一个指定的文件。htaccess的,在哪个目录,你正在处理:

RewriteEngine on 

现在的mod_rewrite模块已经打开,并且已经准备好接受进一步的说明。 RewriteRule命令是模块的根,它告诉mod_rewrite要做什么。下面是它的语法:

重写规则模式替代(可选旗)

下面是一个例子:

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

这将 http://www.yoursite.com/articles.php?id=1取代http://www.yoursite.com/articles/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的创建漂亮的URL

阿帕奇重写引擎主要用来把动态的URL,例如:

www.yoursite.com/product.php?id=123进入静态和用户友好 网址如www.yoursite.com/product/123

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

又如,重写从:

www.yoursite.com/script.php?product=123到 www.yoursite。COM/CAT /产品/ 123/

RewriteRule cat/(.*)/(.*)/$ /script.php?$1=$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]