【问题标题】:Clean URLs in a subfolder清理子文件夹中的 URL
【发布时间】:2023-03-26 21:56:02
【问题描述】:

我已阅读并遵循指南并寻找其他人问题的答案,但我在 url 重写和 htaccess 方面遇到了困难。

我的网站上有一个子文件夹,其中有一个索引页面,它处理查询字符串以显示动态内容。我希望变量显示为子文件夹名称,例如

http://mywebsite.com/subfolder/index.php?v=variable

http://mywebsite.com/subfolder/variable

我制作的 .htaccess 文件位于 http://mywebsite.com/subfolder/ 即与 index.php 相同的文件夹

我怎样才能让它工作?非常感谢任何帮助。

【问题讨论】:

    标签: .htaccess mod-rewrite clean-urls


    【解决方案1】:

    您可以在 /subfolder/.htaccess 中使用这些规则

    RewriteEngine On
    RewriteBase /subfolder/
    
    RewriteCond %{THE_REQUEST} \s/subfolder/index\.php\?v=([^&\s]+) [NC]
    RewriteRule ^ %1? [R=301,L]
    
    RewriteCond %{REQUEST_FILENAME} !-d
    RewriteCond %{REQUEST_FILENAME} !-f
    RewriteRule ^([^/]+)$ index.php?v=$1 [L]
    

    更新(传递两个值)

    RewriteEngine On
    RewriteBase /subfolder/
    
    RewriteCond %{THE_REQUEST} \s/subfolder/index\.php\?v=([^&\s]+)&v2=([^&\s]+)\s [NC]
    RewriteRule ^ %1/%2? [R=301,L]
    
    RewriteCond %{THE_REQUEST} \s/subfolder/index\.php\?v=([^&\s]+)\s [NC]
    RewriteRule ^ %1? [R=301,L]
    
    # Don't touch to existing files/folders
    RewriteCond %{REQUEST_FILENAME} -d [OR]
    RewriteCond %{REQUEST_FILENAME} -f
    RewriteRule ^ - [L]
    
    # Rewrite /xxx to /index.php?v=xxx
    RewriteRule ^([^/]+)$ index.php?v=$1 [L]
    
    # Rewrite /xxx/yyy to /index.php?v=xxx&v2=yyy
    RewriteRule ^([^/]+)/([^/]+)$ index.php?v=$1&v2=$2 [L]
    

    【讨论】:

    • 谢谢!它工作得很好。我想知道你是否可以帮我修改它,以便使用第二个变量,例如mywebsite.com/subfolder/index.php?v=variable&v2=variable2 仍将显示为 mywebsite.com/subfolder/variable
    • 我更新了代码以移除限制,您现在可以在v=variable 之后拥有其他键值对。所有人都将转到/subfolder/variable(不跟踪v2=variable2)。无论如何,请注意不可能将variable2 重写回来,因为它在来自/subfolder/variable 时对它一无所知
    • 谢谢。那太棒了。我真的很感谢你抽出时间来帮助我。你知道是否有一种简单的方法来传递两个值?这部分是因为我使用这种方法来使用包含来构建页面,但也想传递其他变量以允许页面显示的信息由其他变量控制(在这种情况下,它是一个词汇表,我如果选择,我只想显示名词、形容词等)
    • 您可以查看我的答案中的update 部分。如果您有无限(我的意思是很多)变量,恐怕您需要为每个变量制定规则
    【解决方案2】:

    在您的.htaccess 中使用它:

    RewriteEngine On
    RewriteCond %{QUERY_STRING} v=(.+)$ [NC]
    RewriteRule ^ subfolder/%1? [R=301,L,NE]
    

    这使用%{QUERY_STRING} 获取变量,然后使用%1 将其附加到重写。你会看到我在重写的末尾添加了?。那就是阻止原始查询出现在 URL 的末尾。

    我使用了R=301,这是一个永久重定向。您可能希望在测试时将其更改为 R=302,因为这是临时的。

    您可以在此处查看此规则的测试:https://htaccess.madewithlove.be?share=7b6832e9-2c05-5d1d-916c-e4dd0f5b1da6

    确保在测试之前清除缓存。

    【讨论】:

    • 你在哪里内部重写/subfolder/xxx 回来?而且,OP说他的htaccess在subfolder里面。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-01-21
    • 2023-02-01
    • 2021-05-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-10-17
    相关资源
    最近更新 更多