我的网站运行localhost/pm
,RewriteBase正确设置为/pm/
。我的文档中有一个链接标记:<link ... href="themes/default/css/default.css">
。
当网址为localhost/pm
或localhost/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
这也是预期的,这反过来意味着至少我的正则表达是正确的。我错过了什么?
答案 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
文件,以便我们提供更好的建议