【问题标题】:Dynamic htaccess code for multiple php parameters to friendly urls多个php参数的动态htaccess代码到友好的url
【发布时间】:2016-01-06 06:33:32
【问题描述】:

我已经搜索并搜索了这个问题的答案,但我在 stackoverflow 上找到的帖子都没有对我有用 - 在线 htaccess 生成器也没有。

我对 Anubhava 在htaccess redirect for dynamic urls not working 上的出色回答做了一些微调,以适应不同的页面名称,如下所示:

RewriteEngine On

# for external redirection from `/hp.php?su=sitename` to `/sitename`
RewriteCond %{THE_REQUEST} ^[A-Z]{3,}\s/+hp\.php\?su=([^\s&]+) [NC]
RewriteRule ^ /%1? [R=301,L]

# for internal redirection from `/sitename` to `/hp.php?su=sitename`
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^([^/]+)/?$ /hp.php?su=$1 [L,QSA]

但是,除了将用户发送到 domain.com/sitename(上面修改过的代码)之外,我还想更改以下 url。

domain.com/newpage.php?su=sitename&PgID=1234&pu=pagename

成为

domain.com/sitename/1234/pagename.html

相似

domain.com/diary.php?su=sitename

成为

domain.com/sitename/diary.html

最后一个将被复制到类似的动态页面,例如

future.php?su=sitename >> domain.com/sitename/future.html
photos.php?su=sitename >> domain.com/sitename/photos.html

在未来的某个时间,我也想将http:// 转移到https:// - 这条规则会先于其他规则吗?

希望有人能帮忙

更新: 重写引擎开启

RewriteCond %{THE_REQUEST} ^[A-Z]{3,}\s/hp\.php\?su=([^\s&]+) [NC]
RewriteRule ^ /%1? [R=301,L]

RewriteCond %{THE_REQUEST} ^[A-Z]{3,}\s/newpage\.php\?su=([^\s&]+)&PgID=(\d+)&pu=([^&\s]+) [NC]
RewriteRule ^ /%1/%2/%3.html? [R=301,L]

RewriteCond %{THE_REQUEST} ^[A-Z]{3,}\s/(diary|future|photos)\.php\?su=([^\s&]+) [NC]
RewriteRule ^ /%2/%1.html? [R=301,L]

RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^([^/]+)/?$ /hp.php?su=$1 [L,QSA]

RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^([^/]+)/(diary|future|photos).html$ /$2.php?su=$1 [L,QSA]

RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^([^/]+)/(\d+)/(.+)\.html$ /newpage.php?su=$1&PgID=$2&pu=$3 [L,QSA]

【问题讨论】:

    标签: apache .htaccess mod-rewrite url-redirection friendly-url


    【解决方案1】:

    从前面的规则推导出来并不难:

    RewriteEngine On
    
    RewriteCond %{THE_REQUEST} ^[A-Z]{3,}\s/hp\.php\?su=([^\s&]+) [NC]
    RewriteRule ^ /%1? [R=301,L]
    
    RewriteCond %{THE_REQUEST} ^[A-Z]{3,}\s/newpage\.php\?su=([^\s&]+)&PgID=(\d+)&pu=([^&\s]+) [NC]
    RewriteRule ^ /%1/%2/%3.html? [R=301,L]
    
    RewriteCond %{THE_REQUEST} ^[A-Z]{3,}\s/(diary|future|photos)\.php\?su=([^\s&]+) [NC]
    RewriteRule ^ /%2/%1.html? [R=301,L]
    
    RewriteCond %{REQUEST_FILENAME} -f [OR]
    RewriteCond %{REQUEST_FILENAME} -d
    RewriteRule ^ - [L]
    
    RewriteCond %{REQUEST_FILENAME} !-f
    RewriteCond %{REQUEST_FILENAME} !-d
    RewriteRule ^([^/]+)/?$ /hp.php?su=$1 [L,QSA]
    
    RewriteCond %{REQUEST_FILENAME} !-f
    RewriteCond %{REQUEST_FILENAME} !-d
    RewriteRule ^([^/]+)/(diary|future|photos).html$ /$2.php?su=$1 [L,QSA]
    
    RewriteCond %{REQUEST_FILENAME} !-f
    RewriteCond %{REQUEST_FILENAME} !-d
    RewriteRule ^([^/]+)/(\d+)/(.+)\.html$ /newpage.php?su=$1&pgID=$2&pu=$3 [L,QSA]
    

    关于httphttps的第二个问题,是的;该特定重定向应该在所有其他重定向之前发生。

    【讨论】:

    • 谢谢@hjpotter92 - 但不幸的是,我测试过的那个不起作用; domain.com/newpage.php?su=abc&PgID=5&pu=xyz 不会去任何地方,并且 url 停留在地址栏中。 (抱歉,如果您在此回复完成之前收到通知 - 不知道回复已发布回复!)
    • @Chris 如果您有权访问 apache 的 access_logs 文件,请提供记录的请求?
    • 嗨 ajpotter92 - 很遗憾我无法访问这些。
    • @Chris 规则的顺序在这里非常重要。此外,在测试规则之前清除浏览器缓存。我也会更新最后 3 条规则,以防万一。
    • @ajpotter92 - 嗯!这样做了,它仍然不起作用 - 起始的也不再起作用 - domain.com/sitename。非常感谢
    猜你喜欢
    • 2022-11-29
    • 2011-07-11
    • 2016-02-03
    • 2011-01-22
    • 2011-05-09
    • 2014-10-04
    • 2011-02-24
    • 2017-04-12
    • 2012-08-21
    相关资源
    最近更新 更多