【问题标题】:Grouping file extensions for re-writing URL's [.htaccess]为重写 URL 分组文件扩展名 [.htaccess]
【发布时间】:2015-06-06 14:15:12
【问题描述】:

我怎样才能将这两者组合在一起;是不是像 ".(html|php)$" - 请提供代码。

请注意,答案应该适用于所有文件扩展名:您对删除每个文件扩展名有何想法?评论所使用的代码 - 因为很难找到。

RewriteCond %{THE_REQUEST} ^GET\ (.*)\.html\ HTTP
RewriteRule (.*)\.html$ $1 [R=301]
RewriteCond %{REQUEST_FILENAME}.html -f
RewriteCond %{REQUEST_URI} !/$
RewriteRule (.*) $1\.html [L]

RewriteCond %{THE_REQUEST} ^GET\ (.*)\.php\ HTTP
RewriteRule (.*)\.php$ $1 [R=301]
RewriteCond %{REQUEST_FILENAME}.php -f
RewriteCond %{REQUEST_URI} !/$
RewriteRule (.*) $1\.php [L]

【问题讨论】:

标签: .htaccess mod-rewrite url-rewriting rewrite file-extension


【解决方案1】:

很遗憾,这是不可能的。

RewriteCondTestString 部分只能包含纯字符串,并允许服务器变量(例如HTTP_REFERER)和反向引用($1%1,例如)。

因此,您不能在 TestString 中包含表达式 - 只有 CondPatternRewriteCond 的第二部分)允许表达式。

您可以做的最好的事情是使用表达式去除您不想要的扩展,然后,对于您去除的每个扩展,确定它是否存在并相应地重写 - 像这样:

RewriteEngine on

# Step 1: Strip out extensions you don't want for files that actually exist

RewriteCond %{THE_REQUEST} ^GET\ (.*)\.(html|php)\ HTTP
RewriteCond %{REQUEST_FILENAME} -f
RewriteRule ^ %1 [R=301,L]

# Step 2: For each extension stripped, rewrite for existing files

RewriteCond %{REQUEST_FILENAME}.html -f
RewriteRule (.*) $1.html [L]

RewriteCond %{REQUEST_FILENAME}.php -f
RewriteRule (.*) $1.php [L]

旁注:如果 Apache 在 .htaccess 文件中实现某种循环,那就太好了——这将有助于简化这种方法。不幸的是,情况并非如此,因此上述方法几乎是最好的方法。

【讨论】:

  • 谢谢,它减少了 [在我的 htaccess 中] 的代码量;文件大小从 3099 减少到 2318;使代码更干净。虽然很遗憾,几行代码无法删除所有文件扩展名。
  • 不客气。并同意了。这真的归结为Apache不能做的“猜测工作”。这就是为什么循环结构会很棒的原因。
  • 虽然,我也想问:我怎么能从url中删除单词'index',我一直在使用:'RewriteCond %{REQUEST_FILENAME} !-d RewriteRule (.*)/index $ $1/ [R=301] RewriteCond %{REQUEST_URI} /$ RewriteRule (.*)/ $1 [R=301]' - 但这允许两个版本:不使用它,使用它,因此,在我引用了没有的网站,它可以工作 - 但如果用户输入它,他们会得到这个词 - 上面的代码 - 即使你在地址栏中输入了文件扩展名,你提供的也删除了文件扩展名。有没有办法从 url 中“擦除”它,即使你输入它?
  • 您需要在重写之前进行重定向。如果您遇到问题,请提出一个新问题。
【解决方案2】:

看起来你几乎用

回答了你自己的问题

是不是像“.(html|php)$”

您只需要尝试一下。看看这是否适合您对 html and php 文件进行分组。

RewriteCond %{THE_REQUEST} ^GET\ (.*)\.(php|html)\ HTTP
RewriteRule ^ %1 [R=301,L]

RewriteCond %{REQUEST_FILENAME}.php -f
RewriteRule ^([^/]+)/?$ $1.php [L]

RewriteCond %{REQUEST_FILENAME}.html -f
RewriteRule ^([^/]+)/?$ $1.html [L]

还有另一种可能的解决方案。就是不使用上面的代码而使用MultiViews。下面一行代码。

Options +FollowSymLinks +MultiViews

【讨论】:

  • 谢谢你,但不幸的是它对我不起作用:它也会删除文本;我不确定是否还有其他代码导致了这里的问题。但是,值得注意的是:'RewriteRule (.*)/index$ $1/ [R=301] RewriteCond %{REQUEST_FILENAME} !-d RewriteCond %{REQUEST_URI} /$ RewriteRule (.*)/ $1 [R=301 ]' 也被使用。进一步注意,由于错误文档,它会重定向到索引页面。
  • 此外,您为什么不想删除所有文件扩展名:它使相对 URL 更干净; '@import'typography.css'';或'@import'typography';'。
  • 另外,我使用:html|css|ico|js|png|jpg|woff2|woff 作为文件扩展名,如果有一小段代码我将不胜感激[很像第二个例子你给] 只删除文件扩展名。你能否解释一下:[(.+){2,}],为什么你不包括:[RewriteCond %{REQUEST_URI} !/$],还有 [^([^/]+)/?$ $1。 %1]。请注意,目前,我为每个文件扩展名都有代码块,但是,这很混乱,并且在文件中增加了大约 1KB - 因此,我希望只有一个块的解决方案。 // 谢谢你的时间。
  • 对上一个示例进行了更正。我还取出了这个RewriteCond %{REQUEST_URI} !/$,因为它是多余的并且不需要,因为在RewriteRule 中这个([^/]+) 表示必须有值请求,否则它不会运行规则。因此,您无需检查条件是否为空。这可以解决这个问题。
  • 已测试新代码 - 但仍然无法正常工作;它对你有用吗 - 你认为有一些代码 [在我的 .htaccess 文件中] 阻止它工作吗?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多