2009-10-17 100 views
2

我正在使用cms将静态网站转换为一个静态网站。 我有安装在公共目录的子目录中的cms。为了避免与丑陋的域名(http://example.com/cms/)结束了有一个简单的方法使用mod_rewrite重写http://example.com/ ...http://example.com/cms/ ...同时确保,如果该请求将不会在404结束,没有重定向。仅当404发生时才使用mod_rewrite

一个例子:

/ 
/cms/index.html 
/cms/file.dat 
/file.dat 

如果用户请求/index.html,他们应该重定向到/cms/index.html,但如果他们要求/file.dat,他们不应该重定向到/cms/file.dat因为该文件在要求地方

EDIT存在 感谢您的答案。

+1

确保如果'/ CMS/index.html'不是预期的页面,你的服务器实际上返回一个404响应。它可能用于'/ index.html',但不适用于'/ fil.dat' – Macha 2009-10-17 19:26:29

回答

5

您可以使用RewriteCond Directive来检查是否存在与请求的URL相对应的现有文件,并且只有在没有文件时才重新写入CMS。

下面是一个简单的例子:

RewriteEngine on 

RewriteCond %{REQUEST_FILENAME} !-f 
RewriteRule .* index.php 

如果没有现有的文件相对应的请求的URL,然后该请求被改写为index.php

您可能还需要检查符号链接和/或目录,顺便说一句...
举例来说,这里是一个possibility that can be used when setting up a Zend Framework project

RewriteEngine On 
RewriteCond %{REQUEST_FILENAME} -s [OR] 
RewriteCond %{REQUEST_FILENAME} -l [OR] 
RewriteCond %{REQUEST_FILENAME} -d 
RewriteRule ^.*$ - [NC,L] 
RewriteRule ^.*$ index.php [NC,L] 

(即使它链接到ZF,它应该是相当多的项目OK)

2

试试这个规则:

RewriteCond %{REQUEST_FILENAME} !-f 
RewriteRule !^cms/ cms%{REQUEST_URI} [L] 
相关问题