{"id":4466,"date":"2025-05-24T13:09:21","date_gmt":"2025-05-24T13:09:21","guid":{"rendered":"https:\/\/ingenio.vip\/?post_type=tools-pages&#038;p=4466"},"modified":"2025-05-24T13:09:26","modified_gmt":"2025-05-24T13:09:26","slug":"htaccess-redirect-generator","status":"publish","type":"tools-pages","link":"https:\/\/ingenio.vip\/zh\/tools-pages\/htaccess-redirect-generator\/","title":{"rendered":"htaccess Redirect Generator"},"content":{"rendered":"<div class=\"ingenio-tool htaccess-generator-wrapper\" role=\"region\" aria-labelledby=\"htaccess-generator-title\">\r\n  <div class=\"htaccess-generator\">\r\n    <h2 id=\"htaccess-generator-title\">\ud83d\udd00 .htaccess Redirect Generator<\/h2>\r\n    \r\n    <div class=\"generator-controls\">\r\n      <div class=\"redirect-inputs\">\r\n        <div class=\"input-group\">\r\n          <label for=\"source-url\">Source URL (Old URL):<\/label>\r\n          <input type=\"text\" id=\"source-url\" placeholder=\"\/old-page\/\">\r\n        <\/div>\r\n        <div class=\"input-group\">\r\n          <label for=\"target-url\">Target URL (New URL):<\/label>\r\n          <input type=\"text\" id=\"target-url\" placeholder=\"\/new-page\/\">\r\n        <\/div>\r\n        <div class=\"input-group\">\r\n          <label for=\"redirect-type\">Redirect Type:<\/label>\r\n          <select id=\"redirect-type\">\r\n            <option value=\"301\">301 (Permanent)<\/option>\r\n            <option value=\"302\">302 (Temporary)<\/option>\r\n            <option value=\"303\">303 (See Other)<\/option>\r\n            <option value=\"307\">307 (Temporary Keep Method)<\/option>\r\n            <option value=\"410\">410 (Gone)<\/option>\r\n          <\/select>\r\n        <\/div>\r\n        <div class=\"input-group\">\r\n          <label><input type=\"checkbox\" id=\"wildcard-redirect\"> Wildcard Redirect<\/label>\r\n          <label><input type=\"checkbox\" id=\"case-insensitive\"> Case Insensitive<\/label>\r\n          <label><input type=\"checkbox\" id=\"query-string\"> Preserve Query String<\/label>\r\n        <\/div>\r\n      <\/div>\r\n      \r\n      <div class=\"advanced-options\">\r\n        <h3>\u2699\ufe0f Advanced Options<\/h3>\r\n        <div class=\"option-group\">\r\n          <label for=\"redirect-conditions\">Conditions:<\/label>\r\n          <textarea id=\"redirect-conditions\" rows=\"3\" placeholder=\"RewriteCond %{HTTP_HOST} ^example\\.com$\"><\/textarea>\r\n        <\/div>\r\n        <div class=\"option-group\">\r\n          <label for=\"redirect-flags\">Flags:<\/label>\r\n          <input type=\"text\" id=\"redirect-flags\" placeholder=\"[L,NC,QSA]\">\r\n        <\/div>\r\n        <div class=\"action-buttons\">\r\n          <button id=\"generate-btn\" class=\"generate-btn primary\">\u2728 Generate Rule<\/button>\r\n          <button id=\"reset-btn\" class=\"generate-btn secondary\">\ud83d\udd04 Reset<\/button>\r\n          <button id=\"add-to-list-btn\" class=\"generate-btn\">\u2795 Add to Collection<\/button>\r\n        <\/div>\r\n      <\/div>\r\n    <\/div>\r\n    \r\n    <div class=\"output-section\">\r\n      <div class=\"output-header\">\r\n        <h3>\ud83d\udccb Generated .htaccess Rules<\/h3>\r\n        <div class=\"output-actions\">\r\n          <button id=\"copy-all-btn\" class=\"output-btn\">\ud83d\udccb Copy All<\/button>\r\n          <button id=\"download-btn\" class=\"output-btn\">\ud83d\udcbe Download .htaccess<\/button>\r\n          <button id=\"clear-output-btn\" class=\"output-btn\">\ud83d\uddd1\ufe0f Clear<\/button>\r\n        <\/div>\r\n      <\/div>\r\n      <pre id=\"output-code\"><code># Add your redirect rules here\r\nRewriteEngine On<\/code><\/pre>\r\n      \r\n      <div class=\"rules-collection\">\r\n        <h4>\ud83d\udee0\ufe0f Rule Collection<\/h4>\r\n        <div id=\"collection-list\"><\/div>\r\n      <\/div>\r\n    <\/div>\r\n    \r\n    <div class=\"pro-tips\">\r\n      <h3>\ud83d\udca1 Expert Tips<\/h3>\r\n      <ul>\r\n        <li>Always test redirects in staging first<\/li>\r\n        <li>301 redirects are cached by browsers - use carefully<\/li>\r\n        <li>Use 410 for removed content to help SEO<\/li>\r\n        <li>Chain multiple conditions with [OR] flags<\/li>\r\n        <li>Consider regex patterns for complex redirects<\/li>\r\n      <\/ul>\r\n      \r\n      <div class=\"common-patterns\">\r\n        <h4>\ud83d\udd27 Common Redirect Patterns<\/h4>\r\n        <div class=\"pattern-buttons\">\r\n          <button class=\"pattern-btn\" data-pattern=\"www-to-nonwww\">WWW to non-WWW<\/button>\r\n          <button class=\"pattern-btn\" data-pattern=\"http-to-https\">HTTP to HTTPS<\/button>\r\n          <button class=\"pattern-btn\" data-pattern=\"trailing-slash\">Add Trailing Slash<\/button>\r\n          <button class=\"pattern-btn\" data-pattern=\"remove-index\">Remove index.php<\/button>\r\n          <button class=\"pattern-btn\" data-pattern=\"redirect-ip\">Block IP Address<\/button>\r\n        <\/div>\r\n      <\/div>\r\n    <\/div>\r\n  <\/div>\r\n<\/div>\r\n\r\n<style>\r\n  .htaccess-generator-wrapper {\r\n    background-color: var(--bg, #f5f5fa);\r\n    padding: 1rem;\r\n  }\r\n\r\n  .htaccess-generator {\r\n    max-width: 1200px;\r\n    margin: auto;\r\n    background: var(--bg, #fff);\r\n    border-radius: 10px;\r\n    padding: 25px;\r\n    box-shadow: 0 4px 12px rgba(0,0,0,0.08);\r\n    font-family: -apple-system, BlinkMacSystemFont, \"Segoe UI\", Roboto, Oxygen-Sans, Ubuntu, Cantarell, \"Helvetica Neue\", sans-serif;\r\n  }\r\n\r\n  .htaccess-generator h2 {\r\n    text-align: center;\r\n    font-size: 1.8rem;\r\n    color: var(--primary, #607D8B);\r\n    margin-bottom: 1.5rem;\r\n  }\r\n\r\n  .generator-controls {\r\n    display: flex;\r\n    gap: 20px;\r\n    margin-bottom: 20px;\r\n  }\r\n\r\n  .redirect-inputs {\r\n    flex: 1;\r\n  }\r\n\r\n  .input-group {\r\n    margin-bottom: 15px;\r\n  }\r\n\r\n  .input-group label {\r\n    display: block;\r\n    margin-bottom: 5px;\r\n    font-weight: 500;\r\n    color: #555;\r\n  }\r\n\r\n  .input-group input[type=\"text\"] {\r\n    width: 100%;\r\n    padding: 8px;\r\n    border-radius: 4px;\r\n    border: 1px solid #ddd;\r\n  }\r\n\r\n  .input-group select {\r\n    width: 100%;\r\n    padding: 8px;\r\n    border-radius: 4px;\r\n    border: 1px solid #ddd;\r\n  }\r\n\r\n  .input-group label input[type=\"checkbox\"] {\r\n    margin-right: 8px;\r\n  }\r\n\r\n  .advanced-options {\r\n    width: 400px;\r\n    background: #f9f9f9;\r\n    border-radius: 8px;\r\n    padding: 15px;\r\n  }\r\n\r\n  .advanced-options h3 {\r\n    margin-top: 0;\r\n    font-size: 1.1rem;\r\n    color: #555;\r\n  }\r\n\r\n  .option-group {\r\n    margin-bottom: 15px;\r\n  }\r\n\r\n  .option-group label {\r\n    display: block;\r\n    margin-bottom: 5px;\r\n    font-weight: 500;\r\n    color: #555;\r\n  }\r\n\r\n  .option-group textarea {\r\n    width: 100%;\r\n    padding: 8px;\r\n    border-radius: 4px;\r\n    border: 1px solid #ddd;\r\n    resize: vertical;\r\n    min-height: 60px;\r\n    font-family: monospace;\r\n    font-size: 0.9rem;\r\n  }\r\n\r\n  .action-buttons {\r\n    display: flex;\r\n    gap: 10px;\r\n    margin-top: 20px;\r\n  }\r\n\r\n  .generate-btn {\r\n    padding: 10px 15px;\r\n    border: none;\r\n    border-radius: 5px;\r\n    cursor: pointer;\r\n    font-size: 0.95rem;\r\n    transition: all 0.2s;\r\n    display: flex;\r\n    align-items: center;\r\n    justify-content: center;\r\n    gap: 6px;\r\n    flex: 1;\r\n  }\r\n\r\n  .generate-btn.primary {\r\n    background: var(--primary, #607D8B);\r\n    color: white;\r\n  }\r\n\r\n  .generate-btn.secondary {\r\n    background: #f5f5f5;\r\n    color: #333;\r\n    border: 1px solid #ddd;\r\n  }\r\n\r\n  .generate-btn:hover {\r\n    transform: translateY(-1px);\r\n    box-shadow: 0 2px 5px rgba(0,0,0,0.1);\r\n  }\r\n\r\n  .generate-btn.primary:hover {\r\n    background: var(--primary-dark, #455A64);\r\n  }\r\n\r\n  .generate-btn.secondary:hover {\r\n    background: #eee;\r\n  }\r\n\r\n  .output-section {\r\n    background: #f9f9f9;\r\n    border-radius: 8px;\r\n    padding: 15px;\r\n    margin-bottom: 20px;\r\n  }\r\n\r\n  .output-header {\r\n    display: flex;\r\n    justify-content: space-between;\r\n    align-items: center;\r\n    margin-bottom: 15px;\r\n  }\r\n\r\n  .output-header h3 {\r\n    margin: 0;\r\n    font-size: 1.2rem;\r\n  }\r\n\r\n  .output-actions {\r\n    display: flex;\r\n    gap: 10px;\r\n  }\r\n\r\n  .output-btn {\r\n    padding: 8px 15px;\r\n    background: #f0f0f0;\r\n    border: 1px solid #ddd;\r\n    border-radius: 4px;\r\n    cursor: pointer;\r\n    transition: all 0.2s;\r\n    font-size: 0.9rem;\r\n    display: inline-flex;\r\n    align-items: center;\r\n    gap: 5px;\r\n  }\r\n\r\n  .output-btn:hover {\r\n    background: #e0e0e0;\r\n  }\r\n\r\n  #output-code {\r\n    background: #2d2d2d;\r\n    color: #f8f8f2;\r\n    padding: 15px;\r\n    border-radius: 4px;\r\n    font-family: monospace;\r\n    font-size: 0.9rem;\r\n    overflow-x: auto;\r\n    white-space: pre-wrap;\r\n    margin-bottom: 20px;\r\n  }\r\n\r\n  .rules-collection {\r\n    margin-top: 20px;\r\n  }\r\n\r\n  .rules-collection h4 {\r\n    margin: 0 0 10px 0;\r\n    font-size: 1rem;\r\n  }\r\n\r\n  #collection-list {\r\n    background: white;\r\n    border-radius: 4px;\r\n    padding: 10px;\r\n    border: 1px solid #ddd;\r\n    max-height: 200px;\r\n    overflow-y: auto;\r\n  }\r\n\r\n  .rule-item {\r\n    display: flex;\r\n    justify-content: space-between;\r\n    align-items: center;\r\n    padding: 8px;\r\n    border-bottom: 1px solid #eee;\r\n  }\r\n\r\n  .rule-item:last-child {\r\n    border-bottom: none;\r\n  }\r\n\r\n  .rule-item code {\r\n    font-family: monospace;\r\n    font-size: 0.85rem;\r\n    background: #f5f5f5;\r\n    padding: 2px 4px;\r\n    border-radius: 3px;\r\n  }\r\n\r\n  .rule-actions {\r\n    display: flex;\r\n    gap: 5px;\r\n  }\r\n\r\n  .rule-btn {\r\n    background: none;\r\n    border: none;\r\n    cursor: pointer;\r\n    color: #666;\r\n    font-size: 0.9rem;\r\n  }\r\n\r\n  .rule-btn:hover {\r\n    color: var(--primary, #607D8B);\r\n  }\r\n\r\n  .pro-tips {\r\n    background: #ECEFF1;\r\n    border-radius: 10px;\r\n    padding: 15px 20px;\r\n    border-left: 4px solid var(--primary, #607D8B);\r\n  }\r\n\r\n  .pro-tips h3 {\r\n    margin-top: 0;\r\n    margin-bottom: 10px;\r\n    font-size: 1.1rem;\r\n  }\r\n\r\n  .pro-tips ul {\r\n    margin: 0;\r\n    padding-left: 20px;\r\n  }\r\n\r\n  .pro-tips li {\r\n    margin-bottom: 5px;\r\n  }\r\n\r\n  .common-patterns {\r\n    margin-top: 15px;\r\n  }\r\n\r\n  .common-patterns h4 {\r\n    margin: 15px 0 10px 0;\r\n    font-size: 1rem;\r\n  }\r\n\r\n  .pattern-buttons {\r\n    display: flex;\r\n    gap: 10px;\r\n    flex-wrap: wrap;\r\n  }\r\n\r\n  .pattern-btn {\r\n    padding: 8px 15px;\r\n    background: #f0f0f0;\r\n    border: 1px solid #ddd;\r\n    border-radius: 4px;\r\n    cursor: pointer;\r\n    transition: all 0.2s;\r\n    font-size: 0.85rem;\r\n  }\r\n\r\n  .pattern-btn:hover {\r\n    background: #e0e0e0;\r\n  }\r\n\r\n  @media (max-width: 992px) {\r\n    .generator-controls {\r\n      flex-direction: column;\r\n    }\r\n    \r\n    .advanced-options {\r\n      width: 100%;\r\n    }\r\n    \r\n    .output-header {\r\n      flex-direction: column;\r\n      align-items: flex-start;\r\n      gap: 10px;\r\n    }\r\n    \r\n    .output-actions {\r\n      width: 100%;\r\n      justify-content: flex-end;\r\n    }\r\n  }\r\n<\/style>\r\n\r\n<script>\r\ndocument.addEventListener(\"DOMContentLoaded\", function() {\r\n  \/\/ DOM elements\r\n  const sourceUrl = document.getElementById('source-url');\r\n  const targetUrl = document.getElementById('target-url');\r\n  const redirectType = document.getElementById('redirect-type');\r\n  const wildcardRedirect = document.getElementById('wildcard-redirect');\r\n  const caseInsensitive = document.getElementById('case-insensitive');\r\n  const queryString = document.getElementById('query-string');\r\n  const redirectConditions = document.getElementById('redirect-conditions');\r\n  const redirectFlags = document.getElementById('redirect-flags');\r\n  const generateBtn = document.getElementById('generate-btn');\r\n  const resetBtn = document.getElementById('reset-btn');\r\n  const addToListBtn = document.getElementById('add-to-list-btn');\r\n  const copyAllBtn = document.getElementById('copy-all-btn');\r\n  const downloadBtn = document.getElementById('download-btn');\r\n  const clearOutputBtn = document.getElementById('clear-output-btn');\r\n  const outputCode = document.getElementById('output-code');\r\n  const collectionList = document.getElementById('collection-list');\r\n  const patternButtons = document.querySelectorAll('.pattern-btn');\r\n  \r\n  \/\/ Common redirect patterns\r\n  const patterns = {\r\n    'www-to-nonwww': {\r\n      source: '^www\\.(.*)$',\r\n      target: 'https:\/\/$1',\r\n      type: '301',\r\n      conditions: 'RewriteCond %{HTTP_HOST} ^www\\. [NC]',\r\n      flags: '[NC,R=301,L]'\r\n    },\r\n    'http-to-https': {\r\n      source: '^(.*)$',\r\n      target: 'https:\/\/%{HTTP_HOST}$1',\r\n      type: '301',\r\n      conditions: 'RewriteCond %{HTTPS} off',\r\n      flags: '[R=301,L]'\r\n    },\r\n    'trailing-slash': {\r\n      source: '^([^.?]+[^.?\/])$',\r\n      target: '$1\/',\r\n      type: '301',\r\n      conditions: 'RewriteCond %{REQUEST_FILENAME} !-f\\nRewriteCond %{REQUEST_URI} !\/$',\r\n      flags: '[R=301,L]'\r\n    },\r\n    'remove-index': {\r\n      source: '^(.*)\/index\\.php$',\r\n      target: '$1\/',\r\n      type: '301',\r\n      conditions: '',\r\n      flags: '[R=301,L]'\r\n    },\r\n    'redirect-ip': {\r\n      source: '^(.*)$',\r\n      target: '- [G]',\r\n      type: '403',\r\n      conditions: 'RewriteCond %{REMOTE_ADDR} ^123\\.123\\.123\\.123$',\r\n      flags: '[F]'\r\n    }\r\n  };\r\n\r\n  \/\/ Event listeners\r\n  generateBtn.addEventListener('click', generateRedirect);\r\n  resetBtn.addEventListener('click', resetForm);\r\n  addToListBtn.addEventListener('click', addToCollection);\r\n  copyAllBtn.addEventListener('click', copyAllRules);\r\n  downloadBtn.addEventListener('click', downloadHtaccess);\r\n  clearOutputBtn.addEventListener('click', clearOutput);\r\n  \r\n  \/\/ Pattern buttons\r\n  patternButtons.forEach(btn => {\r\n    btn.addEventListener('click', function() {\r\n      const pattern = patterns[this.dataset.pattern];\r\n      if (!pattern) return;\r\n      \r\n      sourceUrl.value = pattern.source;\r\n      targetUrl.value = pattern.target;\r\n      redirectType.value = pattern.type;\r\n      redirectConditions.value = pattern.conditions;\r\n      redirectFlags.value = pattern.flags;\r\n      \r\n      \/\/ Special cases\r\n      wildcardRedirect.checked = pattern.source.includes('.*');\r\n      caseInsensitive.checked = pattern.flags.includes('NC');\r\n      queryString.checked = pattern.flags.includes('QSA');\r\n    });\r\n  });\r\n\r\n  \/\/ Generate redirect rule\r\n  function generateRedirect() {\r\n    const source = sourceUrl.value.trim();\r\n    const target = targetUrl.value.trim();\r\n    const type = redirectType.value;\r\n    \r\n    if (!source) {\r\n      alert('Please enter a source URL');\r\n      return;\r\n    }\r\n    \r\n    if (type !== '410' && !target) {\r\n      alert('Please enter a target URL');\r\n      return;\r\n    }\r\n    \r\n    let rule = '';\r\n    \r\n    \/\/ Add conditions if specified\r\n    const conditions = redirectConditions.value.trim();\r\n    if (conditions) {\r\n      rule += conditions.split('\\n').map(c => c.trim()).filter(c => c).join('\\n') + '\\n';\r\n    }\r\n    \r\n    \/\/ Build the RewriteRule\r\n    rule += 'RewriteRule ';\r\n    \r\n    \/\/ Handle source pattern\r\n    let sourcePattern = source;\r\n    if (wildcardRedirect.checked) {\r\n      if (!sourcePattern.startsWith('^')) sourcePattern = '^' + sourcePattern;\r\n      if (!sourcePattern.endsWith('$')) sourcePattern += '$';\r\n    } else {\r\n      if (!sourcePattern.startsWith('^')) sourcePattern = '^' + sourcePattern;\r\n      if (!sourcePattern.endsWith('$')) sourcePattern = sourcePattern + '\/?$';\r\n    }\r\n    \r\n    rule += sourcePattern + ' ';\r\n    \r\n    \/\/ Handle target\r\n    if (type === '410') {\r\n      rule += '- [G]';\r\n    } else {\r\n      rule += target + ' ';\r\n      \r\n      \/\/ Add flags\r\n      const flags = [];\r\n      flags.push(`R=${type}`);\r\n      \r\n      if (caseInsensitive.checked) flags.push('NC');\r\n      if (queryString.checked) flags.push('QSA');\r\n      \r\n      const customFlags = redirectFlags.value.trim();\r\n      if (customFlags) {\r\n        \/\/ Extract flags from the custom input (remove brackets if present)\r\n        const cleanedFlags = customFlags.replace(\/^$$|$$$\/g, '');\r\n        flags.push(...cleanedFlags.split(',').map(f => f.trim()).filter(f => f));\r\n      }\r\n      \r\n      if (flags.length > 0) {\r\n        rule += `[${flags.join(',')}]`;\r\n      } else {\r\n        rule += '[L]';\r\n      }\r\n    }\r\n    \r\n    \/\/ Update output\r\n    const baseCode = outputCode.textContent.includes('RewriteEngine On') ? \r\n      outputCode.textContent : \r\n      `# Add your redirect rules here\\nRewriteEngine On\\n`;\r\n    \r\n    outputCode.textContent = `${baseCode}\\n${rule}`;\r\n  }\r\n\r\n  \/\/ Add rule to collection\r\n  function addToCollection() {\r\n    const ruleText = outputCode.textContent\r\n      .split('\\n')\r\n      .filter(line => line.trim() && !line.includes('RewriteEngine On'))\r\n      .pop();\r\n    \r\n    if (!ruleText) {\r\n      alert('No rule to add. Generate a rule first.');\r\n      return;\r\n    }\r\n    \r\n    const ruleItem = document.createElement('div');\r\n    ruleItem.className = 'rule-item';\r\n    ruleItem.innerHTML = `\r\n      <code>${ruleText}<\/code>\r\n      <div class=\"rule-actions\">\r\n        <button class=\"rule-btn use-rule\" title=\"Use this rule\">\u21a9\ufe0f<\/button>\r\n        <button class=\"rule-btn remove-rule\" title=\"Remove\">\ud83d\uddd1\ufe0f<\/button>\r\n      <\/div>\r\n    `;\r\n    \r\n    collectionList.appendChild(ruleItem);\r\n    \r\n    \/\/ Add event listeners to new buttons\r\n    ruleItem.querySelector('.use-rule').addEventListener('click', function() {\r\n      outputCode.textContent = `# Add your redirect rules here\\nRewriteEngine On\\n\\n${ruleText}`;\r\n    });\r\n    \r\n    ruleItem.querySelector('.remove-rule').addEventListener('click', function() {\r\n      ruleItem.remove();\r\n    });\r\n  }\r\n\r\n  \/\/ Copy all rules to clipboard\r\n  function copyAllRules() {\r\n    const text = outputCode.textContent;\r\n    if (!text || text === '# Add your redirect rules here\\nRewriteEngine On') {\r\n      alert('No rules to copy');\r\n      return;\r\n    }\r\n    \r\n    navigator.clipboard.writeText(text).then(() => {\r\n      const originalText = copyAllBtn.textContent;\r\n      copyAllBtn.textContent = '\u2713 Copied!';\r\n      setTimeout(() => {\r\n        copyAllBtn.textContent = originalText;\r\n      }, 2000);\r\n    }).catch(err => {\r\n      alert('Failed to copy: ' + err);\r\n    });\r\n  }\r\n\r\n  \/\/ Download as .htaccess file\r\n  function downloadHtaccess() {\r\n    const text = outputCode.textContent;\r\n    if (!text || text === '# Add your redirect rules here\\nRewriteEngine On') {\r\n      alert('No rules to download');\r\n      return;\r\n    }\r\n    \r\n    const blob = new Blob([text], { type: 'text\/plain' });\r\n    const url = URL.createObjectURL(blob);\r\n    const a = document.createElement('a');\r\n    a.href = url;\r\n    a.download = '.htaccess';\r\n    document.body.appendChild(a);\r\n    a.click();\r\n    document.body.removeChild(a);\r\n    URL.revokeObjectURL(url);\r\n  }\r\n\r\n  \/\/ Clear output\r\n  function clearOutput() {\r\n    outputCode.textContent = '# Add your redirect rules here\\nRewriteEngine On';\r\n  }\r\n\r\n  \/\/ Reset form\r\n  function resetForm() {\r\n    sourceUrl.value = '';\r\n    targetUrl.value = '';\r\n    redirectType.value = '301';\r\n    wildcardRedirect.checked = false;\r\n    caseInsensitive.checked = false;\r\n    queryString.checked = false;\r\n    redirectConditions.value = '';\r\n    redirectFlags.value = '';\r\n    clearOutput();\r\n  }\r\n\r\n  \/\/ Initialize\r\n  outputCode.textContent = '# Add your redirect rules here\\nRewriteEngine On';\r\n});\r\n<\/script>","protected":false},"excerpt":{"rendered":"<p>\ud83d\udd00 .htaccess Redirect Generator Source URL (Old URL): Target URL (New URL): Redirect Type: 301 (Permanent) 302 (Temporary) 303 (See Other) 307 (Temporary Keep Method) 410 (Gone) Wildcard Redirect Case Insensitive Preserve Query String \u2699\ufe0f Advanced Options Conditions: Flags: \u2728 Generate Rule \ud83d\udd04 Reset \u2795 Add to Collection \ud83d\udccb Generated .htaccess Rules \ud83d\udccb Copy All [&hellip;]<\/p>\n<\/p><div class=\"more-link\"><a href=\"https:\/\/ingenio.vip\/zh\/tools-pages\/htaccess-redirect-generator\/\" class=\"btn btn-small btn--dark btn-hover-shadow\"><span class=\"text\">Continue Reading<\/span><i class=\"seoicon-right-arrow\"><\/i><\/a><\/div>","protected":false},"author":1,"featured_media":0,"menu_order":0,"template":"elementor_header_footer","meta":{"_acf_changed":false,"googlesitekit_rrm_CAowrpbbCw:productID":"","footnotes":""},"tools-categories":[],"class_list":["post-4466","tools-pages","type-tools-pages","status-publish","hentry"],"acf":[],"aioseo_notices":[],"_links":{"self":[{"href":"https:\/\/ingenio.vip\/zh\/wp-json\/wp\/v2\/tools-pages\/4466","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/ingenio.vip\/zh\/wp-json\/wp\/v2\/tools-pages"}],"about":[{"href":"https:\/\/ingenio.vip\/zh\/wp-json\/wp\/v2\/types\/tools-pages"}],"author":[{"embeddable":true,"href":"https:\/\/ingenio.vip\/zh\/wp-json\/wp\/v2\/users\/1"}],"version-history":[{"count":1,"href":"https:\/\/ingenio.vip\/zh\/wp-json\/wp\/v2\/tools-pages\/4466\/revisions"}],"predecessor-version":[{"id":4467,"href":"https:\/\/ingenio.vip\/zh\/wp-json\/wp\/v2\/tools-pages\/4466\/revisions\/4467"}],"wp:attachment":[{"href":"https:\/\/ingenio.vip\/zh\/wp-json\/wp\/v2\/media?parent=4466"}],"wp:term":[{"taxonomy":"tools-categories","embeddable":true,"href":"https:\/\/ingenio.vip\/zh\/wp-json\/wp\/v2\/tools-categories?post=4466"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}