Drupal 默认通过 apache 的 mod_rewrite 来实现 Clean URLs 功能,大家可以打开根目录下 .htaccess 看到关于 mod_rewrite 的规则,下面我们来分析一下 Drupal 的 rewrite 规则: # Various rewrite rules. RewriteEngine on 后面的三段,是当站点同时绑定了泛域名 (如 example.com) 和 www. (如 www.example.com) 的时候用的,作用是让它们跳转到同一个域名上,[NC] 是说明判断是否匹配域名 (%{HTTP_HOST}) 时忽略大小写,[L,R=301] 说明是最后的一条 rewrite 规则,并且以 301 响应来强制重定向。 接下来两段是表明 rewrite 的目录,如果 Drupal 放在别名的子目录里面,可以通过设定 RewriteBase 来让 apache 正确 rewrite (很多时候我们并不需要这样做)。 最后一段是正式 (无 # 注释掉) 的 rewrite 规则,!-f 判断文件不存在,!-d 判断目录不存在,!=/favicon.ico 判断访问路径不是 favicon.ico (这里避免了当 favicon.ico 确实不存在于文件系统中而导致的跳转,通常这不是我们想要的),过滤后的 URI 都会通过 rewrite 变成 index.php?q=xxx 这样的形式,[L,QSA] 说明是最后一条 rewrite 规则,QSA 说明在后面追加原有的 GET 串。 下面是 Zend Framework 的 .htaccess 设置: RewriteEngine On 这个是官方文档里提出的 .htaccess 的写法,我已经有几乎一年没有用 ZF 了,记得当年 1.3 版本时的写法很简单的,显然现在进步了不少,是从文件系统上判断,而不是仅仅的正则匹配了。先判断是非空文件 (-s) 或者是一个有效的连接 (-l) 或者是一个目录 (-d) 就执行第一个跳转,这里用了 - 和 [L] 来指明符合上面的都不跳转并退出 rewrite,而其他的 URI 也就会全部 rewrite 到 index.php 了。 然后是 CodeIgniter 的 .htaccess 设置: RewriteEngine on CI 只是简单的判断了 URI 是否不以表达式里面的字符串开头,如果符合则 rewrite 题到 index.php,就如当年的 ZF。 最后看看 CakePHP 的: <IfModule mod_rewrite.c> Cake 就更低低了,只是 rewrite 到 webroot 目录的对应文件~~~ 估计现在大家对众多框架的 rewrite 规则都有了解,ZF 的改进也已经明确的告诉我们怎样做了 :)
<IfModule mod_rewrite.c>
? RewriteEngine on
? # If your site can be accessed both with and without the 'www.' prefix, you
? # can use one of the following settings to redirect users to your preferred
? # URL, either WITH or WITHOUT the 'www.' prefix. Choose ONLY one option:
? #
? # To redirect all users to access the site WITH the 'www.' prefix,
? # (http://example.com/... will be redirected to http://www.example.com/...)
? # adapt and uncomment the following:
? # RewriteCond %{HTTP_HOST} ^example\.com$ [NC]
? # RewriteRule ^(.*)$ http://www.example.com/$1 [L,R=301]
? #
? # To redirect all users to access the site WITHOUT the 'www.' prefix,
? # (http://www.example.com/... will be redirected to http://example.com/...)
? # uncomment and adapt the following:
? # RewriteCond %{HTTP_HOST} ^www\.example\.com$ [NC]
? # RewriteRule ^(.*)$ http://example.com/$1 [L,R=301]
? # Modify the RewriteBase if you are using Drupal in a subdirectory or in a
? # VirtualDocumentRoot and the rewrite rules are not working properly.
? # For example if your site is at http://example.com/drupal uncomment and
? # modify the following line:
? # RewriteBase /drupal
? #
? # If your site is running in a VirtualDocumentRoot at http://example.com/,
? # uncomment the following line:
? # RewriteBase /
? # Rewrite URLs of the form 'x' to the form 'index.php?q=x'.
? RewriteCond %{REQUEST_FILENAME} !-f
? RewriteCond %{REQUEST_FILENAME} !-d
? RewriteCond %{REQUEST_URI} !=/favicon.ico
? RewriteRule ^(.*)$ index.php?q=$1 [L,QSA]
</IfModule>
RewriteCond %{REQUEST_FILENAME} -s [OR]
RewriteCond %{REQUEST_FILENAME} -l [OR]
RewriteCond %{REQUEST_FILENAME} -d
RewriteRule ^.*$ - [NC,L]
RewriteRule ^.*$ index.php [NC,L]
RewriteCond $1 !^(index\.php|images|robots\.txt)
RewriteRule ^(.*)$ /index.php/$1 [L]
?? RewriteEngine on
?? RewriteRule??? ^$ app/webroot/??? [L]?
?? RewriteRule??? (.*) app/webroot/$1 [L]?
</IfModule>
详细解决方案
Drupal .htaccess rewrite 规约分析
热度:2059 发布时间:2013-02-26 00:00:00.0
相关解决方案
- 有了 ASP.NET 3.5 的 System.Web.Routing, 为什么还要 URL Rewrite Module解决办法
- 【重赏】url rewrite 虚拟主机,该如何处理
- url rewrite
- rewrite 实现伪静态的有关问题
- 十 个实用的 .htaccess 代码片段
- 21个十分有用的 .htaccess 提示和技巧
- Drupal .htaccess rewrite 规约分析
- 常见的 .htaccess 应用技巧
- 分享几条伪静态守则的写法 .htaccess
- php mvc 透过 htaccess 隐藏 index.php 或 index.php?arg=
- apache+tomcat配置url rewrite 的怪有关问题
- iis rewrite URL二次重写,怎么实现
- ISAPI Rewrite full怎么正确配置,实现二级域名?
- 求url rewrite 正则表达式,该怎么处理
- URL REWRITE 重写有关问题
- windows2003+IIS6.0为啥不能实现asp url rewrite
- php blog url rewrite;解决办法
- htaccess 伪静态跳转有关问题
- .htaccess 小弟我写的重定向如何不起作用
- <html:link> <html:rewrite>差别
- .htaccess 如何跳转
- .htaccess rewrite规则有关问题
- Drupal, Html, PHP and CSS从来没用过,初学,一周以后可以胜任工作吗?该如何解决
- 运用 Drupal 貌似 不需要懂 css, javascript, PHP
- ThinkPHP兑现URL rewrite
- .htaccess url中带有特殊字符的有关问题
- htaccess URL重新有关问题
- 如何才能使用.htaccess
- rewrite 正则 301转为
- .htaccess 可以不可以将静态的URL转到动态的?解决方案