【问题标题】:URL mod_rewrite how to properly create syntax?URL mod_rewrite 如何正确创建语法?
【发布时间】:2014-10-14 05:04:02
【问题描述】:

我有以下网址:

http://example.com/files/101-info/index.php

我的问题是:

  1. 是否可以去掉url中的101-
  2. 是否可以重写地址栏中的名称,但将文件保留在当前位置?

我想让文件显示在:

http://example.com/files/info/index.php

但实际上留在:

/var/www/htdocs/files/101-info/index.php

这是我尝试过的,但我无法删除 101- 并且重定向不起作用:

RewriteEngine On
RewriteRule ^([^/]+)/([0-9]+)-([^\/]+)/(.+)\.php$ /$1/$2/$4 [R] // also tried [NC,QSA]

【问题讨论】:

    标签: php regex .htaccess mod-rewrite


    【解决方案1】:

    注意: 请记住,如果您的 .htaccess 中有其他您在问题中未提及的规则,并且您没有将以下规则放在适当的位置,它不会按预期工作。

    Options +FollowSymLinks -MultiViews
    
    RewriteEngine On
    RewriteBase /
    
    RewriteCond %{THE_REQUEST} ^[A-Z]{3,}\s/+files/[0-9]+-([^/]+)/([^\s\?]+) [NC]
    RewriteRule ^ /files/%1/%2 [R=302,L]
    
    RewriteCond %{REQUEST_FILENAME} !-d
    RewriteCond %{REQUEST_FILENAME} !-f
    RewriteRule ^(files)/([^/]+)/([^/]+)$ /$1/101-$2/$3 [L]
    

    第一条规则将删除101-,第二条规则将在内部接受101-,而无需更改文件夹名称或文件所在的位置。

    一旦您确认它工作正常,请将其从 [R=302,L] 更改为 [R=301,L]

    由于您之前使用了重定向,因此您的浏览器可能已被缓存,因此请清除您的缓存并确保使用其他浏览器测试该 URL,直到您的缓存被清除,因为在删除它后并不总是会发生这种情况。

    【讨论】:

    • 嘿,非常感谢!它很好地重定向到新路径,尽管看起来原始文件也需要在那里。这是正常行为吗?我认为没有办法“屏蔽”网址,因为让文件保留在原始位置但更改浏览器中的路径。还有一个问题,用通配符替换/files/101- 是否容易?
    • @DIF 它应该指向该文件,除非您有一个名为 info 的文件夹,因为内部重写的规则不会使用已经存在的文件夹或文件,换句话说,http://example.com/files/info/index.php 不应该是现有的路径/文件。是的,例如,您可以使用([^/]+)
    • 感谢您的示例确实帮助我更好地理解了这一点。我坚持的一件事是最后的重写规则。我如何使用数字而不是固定常数? /$1/101-$2/$3,我试过$1/$2-$3/$4,但没用。
    • @DIF 对不起,你是什么意思?数字代表 RewriteRule 左侧的组,例如,我示例中的第一个是 (files),即 $1,其他数字依此类推。
    • 101 部分,我如何将其设为通配符而不是硬编码,以便它可以是任意数字,但仍转到正确的 /nnn-info/ 目录?
    猜你喜欢
    • 2016-12-28
    • 1970-01-01
    • 1970-01-01
    • 2020-07-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-06-28
    相关资源
    最近更新 更多