【问题标题】:Remove .php extension (explicitly written) for friendly URL [closed]删除友好 URL 的 .php 扩展名(明确编写)[关闭]
【发布时间】:2012-04-06 22:50:40
【问题描述】:

htaccess 删除我网站文件的 .php 扩展名。

RewriteEngine on
RewriteBase /
RewriteCond %{SCRIPT_FILENAME} !-d
RewriteCond %{SCRIPT_FILENAME} !-f
RewriteRule ^(.*)$ $1.php [L,QSA]

现在,如果我去我的网站

www.mysite.com/home

工作正常,它重定向到 home.php 但 URL 仍然友好。

但如果我写这个网址:

www.mysite.com/home.php

提供了home.php,网址不友好。

如何避免这种行为?我希望如果用户写 www.mysite.com/home.php,则 URL 栏中显示的 URL 是 www.mysite.com/home

【问题讨论】:

    标签: php .htaccess mod-rewrite friendly-url


    【解决方案1】:

    代码

    RewriteEngine On
    RewriteBase /
    
    # remove enter code here.php; use THE_REQUEST to prevent infinite loops
    RewriteCond %{THE_REQUEST} ^GET\ (.*)\.php\ HTTP
    RewriteRule (.*)\.php$ $1 [R=301]
    
    
    # remove index
    RewriteRule (.*)/index$ $1/ [R=301]
    
    # remove slash if not directory
    RewriteCond %{REQUEST_FILENAME} !-d
    RewriteCond %{REQUEST_URI} /$
    RewriteRule (.*)/ $1 [R=301]
    
    # add .php to access file, but don't redirect
    RewriteCond %{REQUEST_FILENAME}.php -f
    RewriteCond %{REQUEST_URI} !/$
    RewriteRule (.*) $1\.php [L]
    

    【讨论】:

    • 花了几个小时尝试了这么多解决方案,您的解决方案很有效,并且得到了很好的评价。谢谢!
    【解决方案2】:

    你可以像这样从请求中删除 .php

    RewriteCond %{REQUEST_URI} ^/(.*).php$
    RewriteRule ^(.*)$ %1 [L,QSA]
    

    【讨论】:

    • 这部分问题有效。我的主要问题是,如果用户引入 mysite.com/file.php,我希望将 URL 重写为 mysite.com/file
    • 是的,上面会将mysite.com/file.php 重定向到mysite.com/file - 然后注意无限循环 - stackoverflow.com/questions/7823801/…
    • 谢谢@scibuff。但是是否可以更改浏览器的 URL?我仍然无法修改它。
    • 使用[L,R=301] 而不是[L,QSA]
    • 啊!现在我得到了310 error: ERR_TOO_MANY_REDIRECTS 我已经评论了这一行#RewriteCond %{SCRIPT_FILENAME} !-f 并将QSA 更改为R=301 这很难让它工作吗?我认为我将不得不使用@Artjom Kurapov 提供的解决方案
    【解决方案3】:

    您也可以将此代码放入您的 .htaccess 文件中:

    options +multiviews
    

    这样做是在当前目录中搜索可用的扩展名(我认为是 .html、.htm 和 .php)。因此,例如,如果您请求 /user,它将寻找 user.php

    【讨论】:

    • 你的答案绝对是他想要的最好的答案:)
    • 嗯,也许不是。如果我把/user,那么一切都好,它重定向到/user.php。但是如果我放/user.php,我希望浏览器的URL也更改为/user,这就是我想要做的。
    • 您可以添加htaccess 规则将所有*.php 重定向到*,如下所示:rewriterule ^(.*)\.php$ $1 [r=301,l]。 (我目前无法对其进行测试,但它应该可以工作)。
    【解决方案4】:

    您的重写将被忽略,因为它会根据您的规则检查现有文件:

    RewriteCond %{SCRIPT_FILENAME} !-f
    

    我建议在 php 中添加一个 URL 检查以重定向到自身(不带扩展名)。或者如果有人访问现有文件,您是否想显示 404 错误?

    【讨论】:

    • 如果我去掉那个 RewriteCond 会有什么影响?我看不出有什么区别。有没有正确的方法来使用 .htaccess,而不是在 php 中重定向?
    • 它会将所有流量路由到您的文件.. 但由于我怀疑您是否会有类似 home.php.php 的内容,因此会导致 404。好吧 apache 不能对浏览器说将导航中的 URL 更改为更清晰的内容。 Mod rewrite 只是将一个 URL 请求转换为其他请求.. 所以你必须说明你想要什么逻辑 - 重定向或仍然提供页面.. 或 404
    猜你喜欢
    • 2017-05-01
    • 2020-01-22
    • 2014-01-25
    • 1970-01-01
    • 2020-08-11
    • 2022-03-04
    • 2015-01-29
    • 2012-08-27
    相关资源
    最近更新 更多