【问题标题】:htaccess rewrite rule for multiple pages with same paramaeters具有相同参数的多个页面的htaccess重写规则
【发布时间】:2021-09-17 16:15:25
【问题描述】:

我一直在为以下 2 个网址制定 htaccess 重写规则:

example.com/main-page.php?pagename=web-hosting 更改为 example.com/basichosting/web-hosting

example.com/sub-page.php?pagename=vps-server 更改为 example.com/advancedhosting/vps-server

我使用以下 .htaccess 重写规则,它可以工作

RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME}\.php -f
RewriteRule ^(.*)$ $1.php [NC,L] 
RewriteRule ^basichosting/([A-Za-z0-9_'-]+)$ main-page.php?pagename=$1 [L]
RewriteRule ^advancedhosting/([A-Za-z0-9_'-]+)$ sub-page.php?pagename=$1 [L]

我真正想要的是我的网址看起来像

example.com/hosting/web-hosting

example.com/hosting/vps-server

是否可以将相应页面名称的“basichosting”和“advancedhosting”更改为“hosting”

否则是否可以从 url 中隐藏“basichosting”和“advancedhosting”。

如果是这样,我该如何编写我的 htaccess 重写规则?

我的 htaccess:

RewriteEngine On

##Rules for existing php files rewrite.
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME}\.php -f
RewriteRule ^(.*)/?$ $1.php [NC,L]

##Rules for external rewrite to hosting uri as per OP need.
RewriteCond %{THE_REQUEST} \s/main\.php\?pagename=(\S+)\s [NC]
RewriteRule ^ /hosting/%1? [R=301,L]
##Rules for internal rewrite to main.php file.
RewriteRule ^(?:[^/]*)/(.*)/?$ main.php?pagename=$1 [L]

##Rules for external rewrite to hosting uri as per OP need.
RewriteCond %{THE_REQUEST} \s/sub\.php\?pagename=(\S+)\s [NC]
RewriteRule ^ /hosting/%1? [R=301,L]
##Rules for internal rewrite to sub.php file.
RewriteRule ^(?:[^/]*)/(.*)/?$  sub.php?pagename=$1 [L]

<IfModule php5_module>
   php_flag asp_tags Off
   php_flag display_errors Off
   php_value max_execution_time 30
   php_value max_input_time 60
   php_value max_input_vars 3000
   php_value memory_limit 64M
   php_value post_max_size 8M
   php_value session.gc_maxlifetime 1440
   php_value session.save_path "/var/cpanel/php/sessions/ea-php56"
   php_value upload_max_filesize 2M
   php_flag zlib.output_compression Off
</IfModule>
<IfModule lsapi_module>
   php_flag asp_tags Off
   php_flag display_errors Off
   php_value max_execution_time 30
   php_value max_input_time 60
   php_value max_input_vars 3000
   php_value memory_limit 64M
   php_value post_max_size 8M
   php_value session.gc_maxlifetime 1440
   php_value session.save_path "/var/cpanel/php/sessions/ea-php56"
   php_value upload_max_filesize 2M
   php_flag zlib.output_compression Off
</IfModule>
<IfModule mime_module>
  AddHandler application/x-httpd-ea-php56 .php .php5 .phtml
</IfModule>

【问题讨论】:

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


    【解决方案1】:

    使用您显示的示例,请尝试遵循 htaccess 规则。请确保在测试您的 URL 之前清除您的浏览器缓存。

    RewriteEngine ON
    
    ##Rules for internal rewrite to hosting uri as per OP need.
    RewriteCond %{REQUEST_FILENAME} !-f
    RewriteCond %{REQUEST_FILENAME} !-d
    RewriteRule ^hosting/(.*)/?$ main.php?pagename=$1 [NC,L]
    
    
    RewriteCond %{REQUEST_FILENAME} !-f
    RewriteCond %{REQUEST_FILENAME} !-d
    RewriteRule ^server/(.*)/?$ sub.php?pagename=$1 [NC,L]
    
    ##Rules for existing php files rewrite.
    RewriteCond %{REQUEST_FILENAME} !-d
    RewriteCond %{REQUEST_FILENAME}\.php -f
    RewriteRule ^(.*)/?$ $1.php [NC,L]
    
    <IfModule php5_module>
       php_flag asp_tags Off
       php_flag display_errors Off
       php_value max_execution_time 30
       php_value max_input_time 60
       php_value max_input_vars 3000
       php_value memory_limit 64M
       php_value post_max_size 8M
       php_value session.gc_maxlifetime 1440
       php_value session.save_path "/var/cpanel/php/sessions/ea-php56"
       php_value upload_max_filesize 2M
       php_flag zlib.output_compression Off
    </IfModule>
    <IfModule lsapi_module>
       php_flag asp_tags Off
       php_flag display_errors Off
       php_value max_execution_time 30
       php_value max_input_time 60
       php_value max_input_vars 3000
       php_value memory_limit 64M
       php_value post_max_size 8M
       php_value session.gc_maxlifetime 1440
       php_value session.save_path "/var/cpanel/php/sessions/ea-php56"
       php_value upload_max_filesize 2M
       php_flag zlib.output_compression Off
    </IfModule>
    <IfModule mime_module>
      AddHandler application/x-httpd-ea-php56 .php .php5 .phtml
    </IfModule>
    

    JS/CS 重写/重定向: 您可能需要使用 base 标签来修复您的 js 和其他相关资源。如果您使用相对路径链接 js 文件,那么该文件显然会得到 404,因为它正在寻找 URL 路径。例如,如果 URL 路径是 /file/ 而不是 file.html,那么您的相关资源将从 /file/ 加载,这不是目录而是重写的 html 文件。要解决此问题,请使您的链接成为绝对链接或使用基本标签。在您的网页标题中添加此&lt;base href="/"&gt;,以便您的相关链接可以从正确的位置加载。

    【讨论】:

    • 这些只是示例页面名......我有很多这样的页面......当点击'example.com/hosting/web-hosting'时应该转到'example.com/main-page.php?当点击 'example.com/hosting/vps-server' 时 pagename=web-hosting' 应该转到 'example.com/sub-page.php?pagename=vps-server
    • 此规则仅适用于 main.php,不适用于 sub.php。如果我为 sub.php 编写相同的规则,则只有 main.php 有效
    • @user_59910105,这就是为什么我在之前的 cmets 中问过,htaccess 如何知道哪个 URL 应该转到 main.php 以及哪个应该转到 sub.php?你说你需要我写的正则表达式,但正则表达式只有在它完全知道哪个链接应该转到哪个 php 文件之前才能有用。所以让我知道这样的规则:如果一个 uri 包含 bla 它应该去 main.php 或者如果一个 uri 包含 `test 它应该去 sub.php 这样,然后我可以为你写。
    • 如果一个页面名包含'hosting'它应该去main.php或者如果一个页面名包含'server'它应该去sub.php
    • 这条规则与我的问题类似。。我仍然清楚我正在寻找的答案。谢谢你的时间..
    猜你喜欢
    • 1970-01-01
    • 2018-01-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-06-14
    • 1970-01-01
    • 2011-08-14
    • 2015-11-12
    相关资源
    最近更新 更多