【问题标题】:How to rewrite an URL after adding a trailing slash (.htaccess / mod_rewrite)?添加斜杠 (.htaccess / mod_rewrite) 后如何重写 URL?
【发布时间】:2012-05-20 07:29:38
【问题描述】:

我不太习惯使用 htaccess 文件,所以我在这个文件上挣扎了一段时间:

我想知道如何在添加尾部斜杠(301 重定向)后将 URL (example.com/foo/bar) 重写为 (example.com/index.php?q=/foo/bar)到初始 URL:

我知道如何单独添加斜杠:

RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_URI} !(.*)/$
RewriteRule ^(.*)$ http://exemple.com/$1/ [L,R=301]

以及如何重写到 index.php :

RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)$ index.php?q=$1 [L]

但我就是不知道如何同时做这两个...

非常欢迎任何帮助!

皮埃尔·弗赖斯

【问题讨论】:

  • 只需将两组行放入一个文件中。无需重复RewriteEngine on 部分。但是我会使用^(.+)$
  • 嗯,这当然是我尝试的第一件事 :) 但它不起作用... 但是我注意到将重写 index.php 首先使 301 重定向转到 index.php? q=XXX 而不是添加尾部斜杠...
  • 重定向应始终排在第一位。你能解释一下什么不起作用吗?我假设这两个脚本都是自己工作的?我真的不明白为什么它不起作用。我唯一能想到的是,当 $_GET['q'] 以斜杠结尾时,php脚本不喜欢它?
  • 确实这 2 个脚本是自己工作的:重定向一个添加斜杠,但我得到一个 404 错误(当然 ^^)和重写一个工作,但我没有斜杠结束。当他们在一起时不起作用的是重定向。重写仍在进行中...

标签: apache .htaccess mod-rewrite


【解决方案1】:

您在这里有一个接受的答案,但我仍然喜欢回答这个问题,因为实际答案更简单,它通过多个(和慢速)重定向运行它,就像在另一个答案中一样。

把这段代码放在你的.htaccessDOCUMENT_ROOT目录下:

Options +FollowSymLinks -MultiViews
RewriteEngine On
RewriteBase /

RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^ index.php?q=%{REQUEST_URI} [L]

【讨论】:

    【解决方案2】:

    在你的 .htaccess 中试试这个(我尽可能地测试了它):

    RewriteEngine On
    RewriteBase /
    
    RewriteCond %{REQUEST_FILENAME} -f [OR]
    RewriteCond %{REQUEST_FILENAME} -d
    RewriteRule ^.*$ - [L]
    
    RewriteCond %{REQUEST_URI} [^/]$
    RewriteRule ^(.*)$ $1/ [L,R=301]
    
    RewriteRule ^(.*)$ index.php?q=$1 [L]
    

    【讨论】:

    • 刚刚试了一下,我想你几乎是对的:现在,重写工作,但重定向有点奇怪:当我尝试 example.com/foo/bar 时,它重定向到 example.com /www/sourcefolder/foo/bar/ (/www/sourcefolder/ 是我网站的 document_root 的绝对路径)
    • 对不起,我在完成答案之前输入了 enter :) 刚刚编辑它!
    • 哦,事实上它有点复杂!我会给你一些细节:我网站的真正绝对路径是“homez.398/bonoworl/www/nebulous/”,我尝试使用“mysite.com/home”(注意,家是我绝对的开始小路)。当我尝试这个时,它会重定向到 mysite.com/homez.398/bonoworl/www/nebulous/home/ 但使用其他东西(如 foo/bar)它可以正常工作......
    • 哦,那是因为home 是一个真正的文件夹,并且开头的规则说如果请求匹配一个真正的文件夹,那么不要进行任何重写并直接进入它。您是否希望使用 /home 执行重写?我仍然对系统路径出现的原因感到困惑。
    • 您的网络服务器配置文件中的 DocumentRoot 是什么?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-02-06
    • 1970-01-01
    • 1970-01-01
    • 2016-03-30
    相关资源
    最近更新 更多