【问题标题】:Add trailing slash for specific rewritten query为特定的重写查询添加斜杠
【发布时间】:2016-01-08 23:29:56
【问题描述】:

我正在研究“ManualTranslation”课程,但我被困在 .htaccess 部分。

我正在尝试仅将此查询 ?language=xx 重写为 /xx/。

到目前为止,我设法使它工作,不确定它是否好用或合适......但它肯定缺少一件事。如果出于某种原因 - 有人尝试通过以下方式手动选择语言:

http://domain.com/it 并且忘记添加斜杠,我的 .htaccess 片段失败。因此,如果此查询参数中缺少该斜杠,它应该自动添加该斜杠。

RewriteEngine On
Options +FollowSymlinks
RewriteBase /

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

RewriteRule ^([a-zA-Z]{2})/(.*)$  $2?language=$1 [QSA]

所以现在,这只适用于这种方式: http://domain.com/it/ 但不是 http://domain.com/it 因为缺少应该存在的尾部斜杠。

如果有人能告诉我我错过了什么?


我还想知道如果找不到语言,是否有机会使用php 删除重写的查询字符串。现在我基本上只是重定向回当前文件,我对它不满意......

if ( isset($query) && !$this->isAllowed($query) )
{
    header("Location: {$_SERVER['PHP_SELF']}");
    exit;
}

【问题讨论】:

    标签: php regex apache .htaccess mod-rewrite


    【解决方案1】:

    您可以调整当前规则以允许不以 / 结尾的 URL:

    RewriteEngine On
    Options +FollowSymlinks
    RewriteBase /
    
    ## Adding a trailing slash
    RewriteCond %{REQUEST_FILENAME} !-f
    RewriteCond %{THE_REQUEST} \s/+.*?[^/][?\s]
    RewriteRule [^/]$ %{REQUEST_URI}/ [L,R=301]
    
    RewriteCond %{REQUEST_FILENAME} !-f
    RewriteCond %{REQUEST_FILENAME} !-d
    RewriteRule ^([a-zA-Z]{2})(/.*)?$ $2?language=$1 [QSA,L]
    

    但请记住,http://domain.com/contacts 之类的 URL 将不受上述规则的影响,并且您不会填充 language 参数。

    【讨论】:

    • 是的,是的。我知道语言参数将在每个页面重定向上消失。但是我将“选定/检测到”的语言存储到会话中以供以后使用。我假设我可以使用 PHP 来强制语言参数,但我不介意这样。您的重写现在可以使用“/”而没有它,但这可能对 SEO 不利?我认为它应该只作为“/xx/”始终关闭。丢失时可以强制使用斜杠吗?
    【解决方案2】:

    试试这个:

    RewriteCond ^([a-z]{2})$ /$1/ [R=301,L,NC]
    

    把它放在你的RewriteBase 行之后。

    【讨论】:

    • 内部服务器错误 500
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-08-27
    • 1970-01-01
    • 2015-01-27
    • 1970-01-01
    • 2017-05-27
    • 1970-01-01
    相关资源
    最近更新 更多