需要删除.html文件扩展名和重复名称

时间:2015-10-22 22:45:42

标签: html .htaccess

我有一个包含以下内容的.htaccess文件,删除了我所有网站页面的.html文件扩展名。

Options +MultiViews
RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^([^\.]+)$ $1.html [NC,L]
RewriteEngine On
RewriteCond %{SERVER_PORT} !=443
RewriteCond %{HTTP_HOST} ^(www\.)?james-lee\.io$ [NC]
RewriteRule ^$ https://www.james-lee.io%{REQUEST_URI} [R,L]

我的链接现在看起来像www.james-lee.io/resume/resume,之前它们看起来像www.james-lee.io/resume/resume.html。我想删除文件夹名称,因此该文件夹的名称不会被文件名减去.html复制,最终结果看起来像www.james-lee.io/resume。

我见过类似的问题但不完全是我要找的。

1 个答案:

答案 0 :(得分:0)

所以我完成了这项任务! 试试这段代码:

RewriteCond %{REQUEST_URI} ^/(.*)/(.*)$
RewriteCond %{DOCUMENT_ROOT}/%1 -d
RewriteCond %{DOCUMENT_ROOT}/%1/%2 -f
RewriteCond %1::%2 ^(.*)::\1$
RewriteRule ^(.*)$  /%1 [R,L]

RewriteCond %{REQUEST_FILENAME} -d
RewriteRule ^(.*)/(.*)$ /$1/$1 [END]

现在我尝试解释这个规则。

  1. 第一行:您请求/ folder / file
  2. 第二行:检查/ folder / real现有文件夹
  3. 第三行:检查/ folder / file是否为真实文件
  4. 第四行:我使用符号%1 ::%2,因为反向引用只能 用于RewriteCond的左侧部分。但它可以重用 左侧部分是右侧部分的图案。所以,在“^(。*):: \ 1 $”中 检查所有之前::。然后我得到了\ 1反向引用的结果。所以, 如果文件夹等于文件,则::之后的文本将等于%2。
  5. 接下来我只是重定向到结果(/文件夹或/文件,没有 问题,因为两者都是平等的)
  6. 但是如果文件夹==文件,重定向将始终到目录。 所以,接下来我检查一下,如果重定向结果是现有的dir并更改链接。

    请求示例: http://yourdomain/test/test

    (这将重定向到http://yourdomain/test,但会引用原始链接)

    我希望,我能清楚解释,但如果您有任何疑问,我很乐意回答。

    感谢您有兴趣的任务!

    P.S。另见%N backreference inside RewriteCond

    <强>已更新即可。你的htaccess必须如下:

    RewriteEngine on
    
    RewriteCond %{SERVER_PORT} !=443
    RewriteCond %{HTTP_HOST} ^(www\.)?james-lee\.io$ [NC]
    RewriteRule ^$ https://www.james-lee.io%{REQUEST_URI} [R,L]
    
    RewriteCond %{REQUEST_URI} ^/(.*)/(.*)$
    RewriteCond %{DOCUMENT_ROOT}/%1 -d
    RewriteCond %{DOCUMENT_ROOT}/%1/%2\.html -f
    RewriteCond %1::%2 ^(.*)::\1$
    RewriteRule ^(.*)$  /%1 [R,L]
    
    RewriteCond %{REQUEST_FILENAME} -d
    RewriteRule ^(.*)/(.*)$ /$1/$1.html [END]
    
    RewriteCond %{REQUEST_FILENAME} !-d
    RewriteCond %{REQUEST_FILENAME} !-f
    RewriteRule ^([^\.]+)$ $1.html [NC,L]