


Implement URL rewriting using .htaccess: Remove query parameters and create beautiful URLs
Understand URL beautification and rewriting requirements
In web development, in order to improve user experience and search engine optimization (SEO), we often need to convert dynamic URLs containing query strings (such as https://example.com/?q=something) into more readable and semantic static URL forms (such as https://example.com/something). This conversion is usually implemented through the server-side URL rewriting module. The most commonly used tool in the Apache server is the .htaccess file and the mod_rewrite module.
Analysis of common rewrite errors and causes
Many developers may encounter a common problem when trying to implement such URL rewrites: rewriting rules cause pages to display exceptions, such as always showing the content of index.php instead of the expected dynamic content. This is usually due to the over-the-top matching pattern of the rewrite rules, resulting in an internal rewrite loop.
An example of a common error rule is as follows:
RewriteEngine On RewriteRule ^(.*) index\.php?q=$1
The matching PHP code may be as follows:
<meta charset="utf-8"> <title>Document</title> <?php echo htmlspecialchars($_GET['q']); ?>
When accessing https://example.com/something using the above .htaccess rules, it is expected to be rewrite it to index.php?q=something. However, if you visit https://example.com/index.php, or during the second processing phase of the internal rewrite engine, the RewriteRule ^(.*) pattern will match index.php again after the request is rewritten to index.php. This causes an internal rewrite of index.php?q=index.php, thus making the value of $_GET['q'] become index.php, not something we expect. This phenomenon is particularly evident when used in .htaccess files (directory context), because Apache's rewrite engine may perform multiple rounds of processing requests for internal rewrites.
The correct solution
To avoid the above internal rewrite loop, we need a more precise regular expression that matches the "clean" URL path we expect while excluding the actual file name (especially index.php) and static resources with file extensions (e.g. .css, .js, .jpg, etc.).
An effective solution is to use the RewriteRule as follows:
RewriteEngine On RewriteRule ^([^.]*)$ index.php?q=$1 [L]
Detailed explanation of the rules
Let's parse the various parts of this rule in detail:
- RewriteEngine On: Enable Apache's rewrite engine.
- RewriteRule: Defines a rewrite rule.
- ^([^.]*)$: This is the matching pattern (regular expression) for rewriting the rules.
- ^: Match the beginning of the URL path.
- ([^.]*): This is a capture group that matches zero or multiple times of any character except the dot (.).
- [^.]: Match any character that is not a dot.
- *: Match the previous character zero or multiple times.
- $: Match the end of the URL path. This pattern ensures that only the full paths that do not contain dots (e.g. /something) will be matched, while file paths like index.php or style.css will not be matched, thus avoiding internal rewrite loops.
- index.php?q=$1: This is the replacement string. When the matching pattern is successful, the original request will be rewritten to this internal path.
- index.php?q=: This is the fixed target file and query parameter name.
- $1: This is a backreference that references what is captured by the first capture group (i.e. ([^.]*)) in the matching pattern. For example, if the request is /something, the value of $1 is something. Note: In the replacement string, dot (.) does not require backslash escape because it is considered a normal character.
- [L]: This is a flag that means "Last" (last rule). This means that if the current RewriteRule match successfully and the rewrite is performed, mod_rewrite will stop processing subsequent rewrite rules. This is crucial to prevent unnecessary rule handling and potential rewrite loops.
- ^([^.]*)$: This is the matching pattern (regular expression) for rewriting the rules.
Supporting PHP code
In the index.php file, you can use $_GET['q'] to get the rewritten parameter value:
<?php // index.php $query_param = isset($_GET['q']) ? $_GET['q'] : 'default_value'; ?> <meta charset="utf-8"> <title>URL rewrite example</title> <h1>The current requested parameters are: <?php echo htmlspecialchars($query_param); ?> </h1> <p>Accessing/something will display "something"</p> <p>Accessing /another-page will display "another-page"</p>
When accessing https://example.com/something, index.php will receive $_GET['q'] as something.
Notes and best practices
- The importance of [L] flag : Always consider using the [L] flag in RewriteRule, especially in the .htaccess environment, to ensure that the rewrite engine stops processing after the match is successful and avoids unexpected behavior.
- The accuracy of regular expressions : ^([^.]*)$ This regular expression assumes that your beautiful URL path does not contain dot numbers. If your URL paths may contain dot numbers (e.g. /my.document), but you still want them to be overridden, then you need more complex regular expressions, or use conditions in RewriteCond to exclude files or directories that actually exist.
- For example, you can use RewriteCond to check whether the requested file or directory exists, and rewrite it if it does not exist:
RewriteCond %{REQUEST_FILENAME} !-f RewriteCond %{REQUEST_FILENAME} !-d RewriteRule ^(.*)$ index.php?q=$1 [L]
This means that if the requested file name is not a real file (!-f) or a real directory (!-d), then rewrite is performed.
- For example, you can use RewriteCond to check whether the requested file or directory exists, and rewrite it if it does not exist:
- .htaccess file location : The .htaccess file should be placed in the root directory of the website (or in the specific directory where you want to apply the rewrite rules).
- Server configuration : Make sure the mod_rewrite module is enabled by the Apache server, and in the httpd.conf or virtual host configuration, the AllowOverride directive for the corresponding directory is set to All or FileInfo to allow the rewrite rules in the .htaccess file to take effect.
- Caching issues : When testing URL rewriting rules, the browser and server side (such as PHP-FPM, OpCache) may have caches. After modifying .htaccess, it is recommended to clear the browser cache or use traceless mode for testing, and restart the Apache service (if httpd.conf is modified) to ensure that the rules take effect.
Summarize
Through precise RewriteRule and understanding of regular expressions, we can effectively use .htaccess to achieve URL beautification and convert dynamic query parameters into concise and user-friendly paths. The key is to select a regular expression that accurately matches the target path and avoids conflicts with the actual file or internal rewrite request, and supplemented with flags such as [L] to control the rewrite process. Mastering these tips will help build more robust and easier to maintain web applications.
The above is the detailed content of Implement URL rewriting using .htaccess: Remove query parameters and create beautiful URLs. For more information, please follow other related articles on the PHP Chinese website!

Hot AI Tools

Undress AI Tool
Undress images for free

Undresser.AI Undress
AI-powered app for creating realistic nude photos

AI Clothes Remover
Online AI tool for removing clothes from photos.

Clothoff.io
AI clothes remover

Video Face Swap
Swap faces in any video effortlessly with our completely free AI face swap tool!

Hot Article

Hot Tools

Notepad++7.3.1
Easy-to-use and free code editor

SublimeText3 Chinese version
Chinese version, very easy to use

Zend Studio 13.0.1
Powerful PHP integrated development environment

Dreamweaver CS6
Visual web development tools

SublimeText3 Mac version
God-level code editing software (SublimeText3)

Common problems and solutions for PHP variable scope include: 1. The global variable cannot be accessed within the function, and it needs to be passed in using the global keyword or parameter; 2. The static variable is declared with static, and it is only initialized once and the value is maintained between multiple calls; 3. Hyperglobal variables such as $_GET and $_POST can be used directly in any scope, but you need to pay attention to safe filtering; 4. Anonymous functions need to introduce parent scope variables through the use keyword, and when modifying external variables, you need to pass a reference. Mastering these rules can help avoid errors and improve code stability.

There are three common methods for PHP comment code: 1. Use // or # to block one line of code, and it is recommended to use //; 2. Use /.../ to wrap code blocks with multiple lines, which cannot be nested but can be crossed; 3. Combination skills comments such as using /if(){}/ to control logic blocks, or to improve efficiency with editor shortcut keys, you should pay attention to closing symbols and avoid nesting when using them.

AgeneratorinPHPisamemory-efficientwaytoiterateoverlargedatasetsbyyieldingvaluesoneatatimeinsteadofreturningthemallatonce.1.Generatorsusetheyieldkeywordtoproducevaluesondemand,reducingmemoryusage.2.Theyareusefulforhandlingbigloops,readinglargefiles,or

The key to writing PHP comments is to clarify the purpose and specifications. Comments should explain "why" rather than "what was done", avoiding redundancy or too simplicity. 1. Use a unified format, such as docblock (/*/) for class and method descriptions to improve readability and tool compatibility; 2. Emphasize the reasons behind the logic, such as why JS jumps need to be output manually; 3. Add an overview description before complex code, describe the process in steps, and help understand the overall idea; 4. Use TODO and FIXME rationally to mark to-do items and problems to facilitate subsequent tracking and collaboration. Good annotations can reduce communication costs and improve code maintenance efficiency.

TolearnPHPeffectively,startbysettingupalocalserverenvironmentusingtoolslikeXAMPPandacodeeditorlikeVSCode.1)InstallXAMPPforApache,MySQL,andPHP.2)Useacodeeditorforsyntaxsupport.3)TestyoursetupwithasimplePHPfile.Next,learnPHPbasicsincludingvariables,ech

ToinstallPHPquickly,useXAMPPonWindowsorHomebrewonmacOS.1.OnWindows,downloadandinstallXAMPP,selectcomponents,startApache,andplacefilesinhtdocs.2.Alternatively,manuallyinstallPHPfromphp.netandsetupaserverlikeApache.3.OnmacOS,installHomebrew,thenrun'bre

In PHP, you can use square brackets or curly braces to obtain string specific index characters, but square brackets are recommended; the index starts from 0, and the access outside the range returns a null value and cannot be assigned a value; mb_substr is required to handle multi-byte characters. For example: $str="hello";echo$str[0]; output h; and Chinese characters such as mb_substr($str,1,1) need to obtain the correct result; in actual applications, the length of the string should be checked before looping, dynamic strings need to be verified for validity, and multilingual projects recommend using multi-byte security functions uniformly.

You can use substr() or mb_substr() to get the first N characters in PHP. The specific steps are as follows: 1. Use substr($string,0,N) to intercept the first N characters, which is suitable for ASCII characters and is simple and efficient; 2. When processing multi-byte characters (such as Chinese), mb_substr($string,0,N,'UTF-8'), and ensure that mbstring extension is enabled; 3. If the string contains HTML or whitespace characters, you should first use strip_tags() to remove the tags and trim() to clean the spaces, and then intercept them to ensure the results are clean.
