基本的URL重写:如何有一个CSS链接,img src等,忽略它?

时间:2013-03-23 17:05:28

标签: .htaccess mod-rewrite

我的网站运行localhost/pm,RewriteBase正确设置为/pm/。我的文档中有一个链接标记:<link ... href="themes/default/css/default.css">

当网址为localhost/pmlocalhost/pm/foo时,CSS工作正常。但是,当URL中有更多斜杠时,如localhost/pm/foo/bar,如果样式表更改为foo/themes/default/css/default.css,则为相对URL。

如何在不必在链接标记中放置某种PHP路径解析的情况下使其工作?

# invoke rewrite engine
RewriteEngine On
RewriteBase /pm/

# Protect application and system files from being viewed
RewriteRule ^(?:system)\b.* index.php/$0 [L]

# Allow any files or directories that exist to be displayed directly
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d

# Rewrite all other URLs to index.php/URL
RewriteRule .* index.php/$0 [PT]

编辑:

基本上我现在需要的是: 如果请求包含文件夹名称/themes/,请废弃/themes/之前的所有内容,并将其余内容重写为/pm/themes/...

我尝试过这样:RewriteRule ^.*(/themes/.*)$ /pm/themes/$1但我收到内部服务器错误。为什么呢?

如果我这样做:RewriteRule ^.*(/themes/.*)$ /pm/themes/(即从最后删除$ 1)并使用网址http://localhost/pm/foo/themes/foo/生成的物理位置为http://localhost/pm/themes这也是预期的,这反过来意味着至少我的正则表达是正确的。我错过了什么?

2 个答案:

答案 0 :(得分:1)

RewriteRule几乎是正确的

RewriteRule ^.*(/themes/.*)$ /pm/themes/$1

这会将http://localhost/pm/foo/themes/default/css/default.css重写为http://localhost/pm/themes/themes/default/css/default.css,这是一个themes太多。请改用

RewriteRule /themes/(.*)$ /pm/themes/$1 [L]

但是现在你有一个无休止的重写循环,因为/pm/themes/..被一次又一次地重写。为防止出现这种情况,您需要RewriteCond/pm/themes

RewriteCond %{REQUEST_URI} !^/pm/themes/
RewriteRule /themes/(.*)$ /pm/themes/$1 [L]

现在请求只被重写一次,你就完成了。

答案 1 :(得分:0)

您可能需要在RewriteRule之前添加以下行:

RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d

如果请求的文件或目录不存在,它将仅评估您的重写规则。

您应该发布.htaccess文件,以便我们提供更好的建议