强制斜杠

时间:2010-10-10 16:17:25

标签: .htaccess mod-rewrite

我正在尝试对我的网址强制使用斜杠,但我不能按照我想要的方式使其工作。这是我的.htaccess文件:

RewriteEngine on

#Force trailing slash
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_URI} !index.php
RewriteCond %{REQUEST_URI} !(.*)/$
RewriteRule ^(.*)$ /$1/ [L,R=301] 

#Subdomains
RewriteCond %{HTTP_HOST} !^www\.example\.com [NC]
RewriteCond %{HTTP_HOST} ^([^/.]+)\.example\.com$
RewriteCond $1/%1 !^([^/]+)/\1$
RewriteRule ^/([^/]+)? /%1%{REQUEST_URI} [L]

#Point everything to page.php
RewriteCond %{HTTP_HOST} !^www\.example\.com [NC]
RewriteCond $1 !^(.*).(php|css|js|png|jpg|gif|htm|html)$
RewriteRule ^(.*)$ page.php?q=$1 [L,NC]

如果我转到“en.example.com/about”,我会被重定向到“en.example.com/en/about/”,这是一个无效页面。

我该如何做到这一点?

1 个答案:

答案 0 :(得分:0)

这里的问题是L flag导致重写过程重启(I’ve already told you that重启),不是吗?):

  

但请记住,如果RewriteRule生成内部重定向(在每个目录上下文中重写时经常发生),这将重新注入请求并导致从第一个{重复开始重复处理} {1}}。

现在请求RewriteRule时,第一条规则将被应用并重定向到/about。然后处理/about/的后续请求,首先应用第三个规则,并将URL路径重写为/about/。到目前为止,非常好。

但现在发生内部重定向,并使用新的URL路径/page.php重新启动重写过程。然后,第一个规则再次获取此内容,并将其重定向到/page.php

第二条规则根本不应用,因为模式/page.php/永远不应与per-directory path prefix is removed before testing the pattern when using mod_rewrite in an .htaccess file匹配:

  

在.htaccess文件中使用重写引擎时,每个目录前缀(对于特定目录始终相同)会自动删除以进行模式匹配并自动添加替换完成后。

但这些规则应该有效:

^/