【问题标题】:Force trailing slash强制尾部斜杠
【发布时间】:2010-10-10 16:17:24
【问题描述】:

我试图在我的 URL 后面加上一个斜杠,但我无法让它按照我想要的方式工作。这是我的 .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/”,这是一个无效页面。

我怎样才能做到这一点?

【问题讨论】:

    标签: .htaccess mod-rewrite


    【解决方案1】:

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

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

    现在,当请求 /about 时,将应用第一个规则并重定向到 /about/。然后处理/about/的后续请求,首先应用第三条规则并将URL路径重写为/page.php。到目前为止,一切顺利。

    但是现在内部重定向发生并且重写过程使用新的 URL 路径 /page.php 重新开始。然后再次被第一条规则获取并在外部重定向到/page.php/

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

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

    但这些规则应该有效:

    RewriteCond %{REQUEST_FILENAME} !-f
    RewriteRule .*[^/]$ /$0/ [L,R=301]
    
    RewriteCond %{HTTP_HOST} ^([^/.]+)\.example\.com$ [NC]
    RewriteCond %1 !=www [NC]
    RewriteCond $0/%1 !^([^/]+)/\1$
    RewriteRule ^[^/]* /%1%{REQUEST_URI} [L]
    
    RewriteCond %{HTTP_HOST} !=www.example.com [NC]
    RewriteCond $1 !.*\.(php|css|js|png|jpg|gif|htm|html)$
    RewriteRule .* page.php?q=$0 [L]
    

    【讨论】:

    • 我对 mod_rewrite 还不是很专业,所以我非常感谢您花时间学习。我的浏览器告诉我页面指向错误 - 第 6 行的零真的是零吗?
    • @Ivarska:是的,$0 指的是整个模式的匹配字符串。但由于这似乎不起作用,您应该使用mod_rewrite’s logging feature 自己进行一些调试。
    • 嗯,好吧 - 为什么我问是因为你在关于子域的主题中帮助我时写了 1 美元。具有讽刺意味的是,RewriteLogLevel 9 给了我一个错误代码 500 - RewriteLogLevel 0 也是如此。我把它放在第一行,所以有点奇怪。
    • 太糟糕了,因为该站点位于虚拟主机上,所以我无法访问任何配置文件。
    猜你喜欢
    • 1970-01-01
    • 2018-02-18
    • 2012-07-15
    • 2023-03-04
    • 1970-01-01
    • 2013-02-28
    • 1970-01-01
    • 1970-01-01
    • 2021-12-27
    相关资源
    最近更新 更多