当规则具有斜杠条件时,.htaccess规则不排除现有文件

时间:2013-09-05 11:09:01

标签: .htaccess

我正在重定向此类网址

http://www.site.com/windows/games/ or http://www.site.com/windows/games
http://www.site.com/windows/software/ or http://www.site.com/windows/software

http://www.site.com/windows/ct.php?ct=games
http://www.site.com/windows/ct.php?ct=software

网站结构

wamp/www/Site/windows/ct.php

我正在尝试这种方式正确地重定向,但是当url在结尾处重写斜杠时,它也会重写css,js文件。

RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^windows/([^/]*)/?$ /Site/windows/ct.php?ct=$1 [L]

这种类型的网址已经应用了css和javascript。

http://www.site.com/windows/games

但是这种类型的网址没有应用css和javascript。 (不使用尾部斜杠)。

http://www.site.com/windows/games/

我尝试了几种语法,如

RewriteRule ^windows/([^/]+)/?$ /windows/ct.php?ct=$1 [L]
RewriteRule ^windows/(^(.[^/]*)/?)$ /windows/ct.php?ct=$1 [L]
RewriteRule ^windows/([^/]*)/? /windows/ct.php?ct=$1 [L]
RewriteRule ^windows/([^/]+)/? /windows/ct.php?ct=$1 [L]

但它不起作用。

完成.htaccess

Options +FollowSymlinks -MultiViews
RewriteEngine on
<IfModule mod_rewrite.c>
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^windows/([^/]*)/?$ /Site/windows/ct.php?ct=$1 [L]
RewriteRule ^[^/]*/[^/]*/(.*\.html) /Site/error/400/ [L]
RewriteRule ^(error) - [L]
RewriteRule ^sitemap\.xml$ sitemap.php [L]
RewriteRule ^rss/(.*?)\.xml$ rss/$1.php [L]
</IfModule>

ErrorDocument 404 /Site/error/404/

请参阅并建议任何可行的方法。

感谢。

2 个答案:

答案 0 :(得分:2)

这里的问题是,当你添加一个尾部斜杠时你的相对路径会中断,因为它引入了两级目录结构,而CSS / JS文件路径只出现..一次。因此,在为RewriteRule之类的路径解析404时,您的/windows/global/js/js.js实际上也会触发CSS / JS文件。但是,脚本仍然无法正常工作,因为它们不在/Site下,而且这是您的规则从中提供请求的地方。

因此,在不触及相对URL或资源位置的情况下修复问题;添加另一条规则如下:

RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^windows/([^/]*)/?$ /Site/windows/ct.php?ct=$1 [L]

RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^windows/(global/.*)$ /$1 [L] # handles css|js files

.htaccess的其余部分(当然)保持不变。

答案 1 :(得分:1)

我在.htaccess中使用以下规则,但这可能过于笼统:

RewriteRule ^q/([^/]+)/([^/]+)(\/?)$ /path/to/q.php?type=$1&q=$2&{QUERY_STRING} [NC]

这对你来说可能更好:

RewriteRule ^windows(\/?)$ /path/to/windows.php?{QUERY_STRING} [NC]
RewriteRule ^windows/([^/]+)(\/?)$ /path/to/windows.php?type=$1&{QUERY_STRING} [NC]

您必须根据自己的情况进行更改。我没有对此进行过测试,但我希望它足以让你到达你想要的地方。