แก้ปัญหา Joomla บน IIS ให้ใช้งาน URL Rewrite ภาษาไทยได้

การพัฒนาเว็บด้วย จูมล่า (Joomla) หรือระบบ Content Management System (CMS) นั้น ได้รับนิยม ไปทั่วโลกเนื่องจากไม่มีค่าลิขสิทธิ์ และยังมีความสามารถสูงในการปรับเปลี่ยนแก้ไขส่วนต่างๆ ที่เกี่ยวข้องกับการพัฒนาเว็บ

ในส่วนที่เกี่ยวข้องกับการทำ Url ของเว็บให้ดูสวยงามสอบคล้องกับ ชื่อ บทความ เรียกว่าการเขียน Url ใหม่ ( Url Rewrite ) สำหรับ จูมล่าจะทำงานร่วมกับระบบที่เรียกว่า การทำให้ Url เป็นมิตรกับระบบเซอร์อินจิน คนอ่านแล้วเข้าใจ ( Enabling Search Engine Friendly (SEF) URLs, human-readable )

การปรับแต่งให้ Url ของ Joomla รองรับการทำงาน แบบ SEO , SEF
การปรับแต่งให้ Url ของ Joomla รองรับการทำงาน แบบ SEO , SEF

 

จากเอกสารของ Joomla (https://docs.joomla.org/Enabling_Search_Engine_Friendly_(SEF)_URLs)

เมื่อกำหนดค่า SEO บน จูมล่า ดังกล่าวแล้ว ต้องไป ปรับเปลี่ยน ไฟล์บางตัว ขึ้นอยู่กับ เว็บเซอร์เวอร์ นั้นเป็นอะไร เช่น

Apache

ให้ไปเปลี่ยนชื่อไฟล์ “htaccess.txt” ซึ่งอยู่ใน จูมล่า โฟลเดอร์ หลัก อยู่แล้ว เป็น “.htaccess

Url ของเว็บที่ได้หลังปรับแต่งจะได้ประมาณนี้

http://www.example.com/the-­news/1­-latest-­news/1-­welcome-­to­-joomla

 

Hiawatha

ตามกฏของการใช้งาน UrlToolkit rule เพื่อให้ได้ Url สวยงาน ( clean Url)

UrlToolkit {
    ToolkitID = joomla
    Match base64_encode.*\(.*\) DenyAccess
    Match (<|%3C).*script.*(>|%3E) DenyAccess
    Match GLOBALS(=|\[|\%[0-9A-Z]{0,2}) DenyAccess
    Match _REQUEST(=|\[|\%[0-9A-Z]{0,2}) DenyAccess
    RequestURI exists Return
    Match /index.php Return
    Match ^/component/ Skip 2
    Match ^(/|\.php|\.html|\.htm|\.feed|\.pdf|\.raw|/[^.]*)$ Skip 1
    Skip 1
    Match .* Rewrite /index.php
}

ให้สังเกตที่บรรทัด
VirtualHost {
    ...
    UseToolkit = joomla
}

เป็นการเปิด UrlToolkit rule


Nginx

ได้บอกว่าให้ เพิ่มโค๊ดเข้าในไฟล์ที่ชื่อว่า “nginx.conf” ดังนี้

# Support Clean (aka Search Engine Friendly) URLs
   location / {
      try_files $uri $uri/ /index.php?$args;
   }

ถ้าใส่โค๊ดแล้วยังไม่ทำงานให้ปรับเปลี่ยนดังนี้
server {
  ....
  location / {
     expires 1d;

     # Enable joomla SEF URL's inside Nginx
     try_files $uri $uri/ /index.php?$args;
  }
  ....
}


IIS 7

คือระบบ เว็บเซอร์ที่ทำงานบนระบบวินโดวเซอเวอร์ เวอร์ชั่นก่อนของ IIS รองรับการทำงาน โค๊ด PHP แต่ไม่รองรับการทำงานแบบ Url Rewrite แต่เวอร์ชั่นที่ออกมาในปัจจุบันสามารรองรับการงานแล้วเนื่องจากไมโครซอฟ ได้เปิดโอกาศให้โปรแกรมจำพวก PHP ทำงานบน IIS ได้เต็มที่

ถ้า โมดูล  Url Rewrite ติดตั้งอยู่ ให้ไปกำหนดค่าดังนี้

  • Pattern field: ^([^/]+)/?$
  • Ignore case ON
  • Action type: Rewrite
  • Rewrite URL: index.php/

และแก้ไขไฟล์ web.config ตาม Joomla.org แนะนำให้ทำดังนี้

<?xml version="1.0" encoding="UTF-8"?>
<configuration>
    <system.webServer>
        <rewrite>
            <rules>
                <clear />
                <rule name="Common Exploit Blocking" stopProcessing="true">
                    <match url="^(.*)$" />
                    <conditions logicalGrouping="MatchAny">
                        <add input="{QUERY_STRING}" pattern="mosConfig_[a-zA-Z_]{1,21}(=|\%3D)" />
                        <add input="{QUERY_STRING}" pattern="base64_encode.*\(.*\)" />
                        <add input="{QUERY_STRING}" pattern="(\&lt;|%3C).*script.*(\>|%3E)" />
                        <add input="{QUERY_STRING}" pattern="GLOBALS(=|\[|\%[0-9A-Z]{0,2})" />
                        <add input="{QUERY_STRING}" pattern="_REQUEST(=|\[|\%[0-9A-Z]{0,2})" />
                    </conditions>
                    <action type="Redirect" url="index.php" appendQueryString="false" redirectType="SeeOther" />
                </rule>
                <rule name="Joomla Search Rule" stopProcessing="true">
                    <match url="(.*)" ignoreCase="true" />
                    <conditions logicalGrouping="MatchAll">
                        <add input="{URL}" pattern="^/search.php" ignoreCase="true" />
                    </conditions>
                    <action type="Rewrite" url="/index.php?option=com_content&amp;view=article&amp;id=4" />
                </rule>
                <rule name="Joomla Main Rewrite Rule" stopProcessing="true">
                    <match url="(.*)" ignoreCase="true" />
                    <conditions logicalGrouping="MatchAll">
                        <add input="{URL}" pattern="(/[^.]*|\.(php|html?|feed|pdf|raw))$" />
                        <add input="{REQUEST_FILENAME}" matchType="IsFile" negate="true" />
                        <add input="{REQUEST_FILENAME}" matchType="IsDirectory" negate="true" />
                    </conditions>
                    <action type="Rewrite" url="index.php/" />
                </rule>
            </rules>
        </rewrite>
        <caching>
            <profiles>
                <add extension=".php" policy="DisableCache" kernelCachePolicy="DisableCache" />
            </profiles>
        </caching>
    </system.webServer>
</configuration>

 

 

แต่ยังมีสิ่งที่ต้องแก้ไขสำหรับ Joomla ที่มี Url แสดงอยู่ ต้องแก้ไขดังนี้

ไฟล์ web.config ให้เพิ่มโค๊ด ?requesturi={URL} เข้าไปใน <action type…

Snippet

<action type="Rewrite" url="index.php?requesturi={URL}" />

จะได้ไฟล์ web.config ใหม่ดังนี้
<?xml version="1.0" encoding="UTF-8"?>
<configuration>
    <system.webServer>
        <rewrite>
            <rules>
                <clear />
                <rule name="Common Exploit Blocking" stopProcessing="true">
                    <match url="^(.*)$" />
                    <conditions logicalGrouping="MatchAny">
                        <add input="{QUERY_STRING}" pattern="mosConfig_[a-zA-Z_]{1,21}(=|\%3D)" />
                        <add input="{QUERY_STRING}" pattern="base64_encode.*\(.*\)" />
                        <add input="{QUERY_STRING}" pattern="(\&lt;|%3C).*script.*(\>|%3E)" />
                        <add input="{QUERY_STRING}" pattern="GLOBALS(=|\[|\%[0-9A-Z]{0,2})" />
                        <add input="{QUERY_STRING}" pattern="_REQUEST(=|\[|\%[0-9A-Z]{0,2})" />
                    </conditions>
                    <action type="Redirect" url="index.php" appendQueryString="false" redirectType="SeeOther" />
                </rule>
                <rule name="Joomla Search Rule" stopProcessing="true">
                    <match url="(.*)" ignoreCase="true" />
                    <conditions logicalGrouping="MatchAll">
                        <add input="{URL}" pattern="^/search.php" ignoreCase="true" />
                    </conditions>
                    <action type="Rewrite" url="/index.php?option=com_content&amp;view=article&amp;id=4" />
                </rule>
                <rule name="Joomla Main Rewrite Rule" stopProcessing="true">
                    <match url="(.*)" ignoreCase="true" />
                    <conditions logicalGrouping="MatchAll">
                        <add input="{URL}" pattern="(/[^.]*|\.(php|html?|feed|pdf|raw))$" />
                        <add input="{REQUEST_FILENAME}" matchType="IsFile" negate="true" />
                        <add input="{REQUEST_FILENAME}" matchType="IsDirectory" negate="true" />
                    </conditions>
                    <action type="Rewrite" url="index.php?requesturi={URL}" /> 
</rule> </rules> </rewrite> <caching> <profiles> <add extension=".php" policy="DisableCache" kernelCachePolicy="DisableCache" /> </profiles> </caching> </system.webServer> </configuration>

และที่ ไฟล์ index.php ให้เพิ่ม โค๊ด
Snippet
$_SERVER['REQUEST_URI'] = isset($_GET['requesturi']) ? $_GET['requesturi'] : '/';

สำหรับไฟล์ index.php ใน Joomla 3 เต็มจะเป็นแบบนี้


<?php
/**
 * @package    Joomla.Site
 *
 * @copyright  Copyright (C) 2005 - 2015 Open Source Matters, Inc. All rights reserved.
 * @license    GNU General Public License version 2 or later; see LICENSE.txt
 */

/*
* To fix IIS Rewrite Url
*/
 
$_SERVER['REQUEST_URI'] = isset($_GET['requesturi']) ? $_GET['requesturi'] : '/';

/**
 * Define the application's minimum supported PHP version as a constant so it can be referenced within the application.
 */
define('JOOMLA_MINIMUM_PHP', '5.3.10');

if (version_compare(PHP_VERSION, JOOMLA_MINIMUM_PHP, '<'))
{
	die('Your host needs to use PHP ' . JOOMLA_MINIMUM_PHP . ' or higher to run this version of Joomla!');
}

/**
 * Constant that is checked in included files to prevent direct access.
 * define() is used in the installation folder rather than "const" to not error for PHP 5.2 and lower
 */
define('_JEXEC', 1);

if (file_exists(__DIR__ . '/defines.php'))
{
	include_once __DIR__ . '/defines.php';
}

if (!defined('_JDEFINES'))
{
	define('JPATH_BASE', __DIR__);
	require_once JPATH_BASE . '/includes/defines.php';
}

require_once JPATH_BASE . '/includes/framework.php';

// Mark afterLoad in the profiler.
JDEBUG ? $_PROFILER->mark('afterLoad') : null;

// Instantiate the application.
$app = JFactory::getApplication('site');

// Execute the application.
$app->execute();

เมื่อแก้ทั้งหมดแล้ว ก็ได้  Url สวยๆ คนอย่างเข้าใจได้ รองรับ SEO ให้ Joomla ของคุณ

 

 

SEO Agency on sabtwitterSEO Agency on sabgoogleSEO Agency on sabfacebookSEO Agency on sabemail
SEO Agency
Web Developer with PHP / C#.NET / VB.NET
Database Developer with T-SQL / MY-SQL / MS-SQL
SEO Agency for GET SEO Services
¸¸.•*¨*•♫♪ Ƹ̵̡Ӝ̵̨̄Ʒ ♥ ♥ ¸.•*´ ♡♥ ★ ♡♥ ☆ `*•.¸ ♥ ♥ Ƹ̵̡Ӝ̵̨̄Ʒ
ผู้เชียวชาญด้านการพัฒนาเว็บไซด์ด้วย ภาาษ PHP / C#.NET / VB.NET
ผู้เชียวชาญด้านการพัฒนาออกแบบระบบฐานข้อมูล T-SQL / MY-SQL / MS-SQL
ให้บริการ ปรับแต่ง SEO สำหรับเว็บไซด์

ใส่ความเห็น

อีเมลของคุณจะไม่แสดงให้คนอื่นเห็น ช่องที่ต้องการถูกทำเครื่องหมาย *