mod重写做一些奇怪的事情

时间:2012-07-06 11:04:55

标签: .htaccess mod-rewrite

http://localhost/clean_urls/user/whtffgh重定向到此http://localhost/clean_urls/user/whtffgh/(几乎任何我放在那里的东西)。

http://localhost/clean_urls/user/cohen然而,重定向到此 http://localhost/clean/我不明白为什么。它应该只添加/

继承我的.htaccess代码

<ifModule mod_rewrite.c>
    RewriteEngine On
    RewriteBase /
    RewriteCond %{REQUEST_FILENAME} !-f
    RewriteCond %{REQUEST_URI} !(.*)/$
    RewriteRule ^(.*)$ /clean_urls/user/$1/ [L,R=301]

    RewriteBase /clean_urls/user/

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

    RewriteRule ^([a-zA-Z0-9]+)/$ index.php?user=$1


</ifModule>

更新:

当我将cohen作为用户名时,代码也有效。 .htaccess文件的第二部分使user/index.php?user=username看起来像user/username所以它只是一个$ _GET变量,在url中看起来不错,并且是SEO友好的(显然)。

我只是在学习这些东西并制作一个webapp来尝试它,所以不确定它的发展方向,但我认为我最终还需要另一个变量。 http:://localhost/clean_urls/user/fred/someverb

1 个答案:

答案 0 :(得分:1)

您误解了RewriteBase指令的用途。它帮助重写引擎在“每个目录”上下文中将相对URI转换为正确的文件名等效。

每个.htaccess文件只应有一个 RewriteBase指令。默认情况下,重写引擎将使用路径上.htaccess的最低RewriteEngine On文件,并设置RewriteBase / 指令。

所以在DOCroot(即“GET / xxx”映射到的目录中,这应该是

.htaccess

如果您的DOCroot/clean_urls/user文件位于RewriteBase /clean_urls/user/ ,那么它应该

http:://localhost/fred

您希望如何解码http:://localhost/clean_urls/user/fred/形式的URI,或者只想要处理http:://localhost/clean_urls/user/fred/someverb形式的进程URI。那么.htaccess呢?

让我知道你在哪里{{1}}然后我可以给你正确的内容。