我正在尝试对我的网址强制使用斜杠,但我不能按照我想要的方式使其工作。这是我的.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/”,这是一个无效页面。
我该如何做到这一点?
答案 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文件中使用重写引擎时,每个目录前缀(对于特定目录始终相同)会自动删除以进行模式匹配并自动添加替换完成后。
但这些规则应该有效:
^/