我的目标是使用.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
如果有必要,我可以把它放在服务器配置中,但是,我想保持简单愚蠢。
答案 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]